protected AuthenticationInfo extractAuthentication(
HttpServletRequest request, HttpServletResponse response) {
OpenIdUser user = null;
try
{
user = relyingParty.discover(request);
// Authentication timeout
if(user == null && RelyingParty.isAuthResponse(request))
{
log.debug("OpenID authentication timeout");
response.sendRedirect(request.getRequestURI());
return AuthenticationInfo.DOING_AUTH;
}
if(request.getPathInfo() != null) {
String requestPath = request.getPathInfo();
if(requestPath != null) {
if(OpenIDConstants.LOGOUT_REQUEST_PATH.equals(requestPath)) {
relyingParty.invalidate(request, response);
user = null;
return handleLogout(request, response);
}
// handle (possibly)anon auth resources
else if (loginForm.equals(requestPath) ||
authFailUrl.equals(requestPath) ||
logoutUrl.equals(requestPath)) {
if (loginForm.equals(requestPath)) {
// can force a login with Allow Anonymous enabled, by requesting
// login form directly. Checking this parameter allows us
// to redirect user somewhere useful if login is successful
if(request.getParameter(OpenIDConstants.REDIRECT_URL_PARAMETER) != null) {
request.getSession().setAttribute(OpenIDConstants.ORIGINAL_URL_ATTRIBUTE,
request.getParameter(OpenIDConstants.REDIRECT_URL_PARAMETER));
}
moveAttributeFromSessionToRequest(
OpenIDConstants.OPENID_FAILURE_REASON_ATTRIBUTE,
OpenIDConstants.OpenIDFailure.class,
request);
moveAttributeFromSessionToRequest(
OpenIDConstants.ORIGINAL_URL_ATTRIBUTE,
String.class,
request);
} else if (authFailUrl.equals(requestPath)) {
// move the failure reason attribute from session to request
moveAttributeFromSessionToRequest(
OpenIDConstants.OPENID_FAILURE_REASON_ATTRIBUTE,
OpenIDConstants.OpenIDFailure.class,
request);
moveAttributeFromSessionToRequest(
OpenIDConstants.ORIGINAL_URL_ATTRIBUTE,
String.class,
request);
}
if(accessAuthPageAnon) {
// Causes anonymous login
// but does not respect SlingAuthenticator allowAnonymous
return new AuthenticationInfo(OpenIDConstants.OPEN_ID_AUTH_TYPE, null);
}
}
}
}
if(user != null) {
if(user.isAuthenticated()) {
// user already authenticated
request.setAttribute(OpenIdUser.ATTR_NAME, user);
return getAuthInfoFromUser(user);
} else if(user.isAssociated()) {
if(RelyingParty.isAuthResponse(request)) {
if(relyingParty.verifyAuth(user, request, response)) {
// authenticated
response.sendRedirect(request.getRequestURI());
return AuthenticationInfo.DOING_AUTH;