Spring Security 3.0 Google Apps öffnen ID melden Sie sich mit OpenID4Java
-
26-09-2019 - |
Frage
Ich versuche, in der Verwendung von Google Apps offen ID mit OpenID4Java Bibliothek zu unterzeichnen.
Ich entdecke den Benutzer Dienst des folgenden Code in der Consumer-Klasse:
try
{
discoveries = consumerManager.discover(identityUrl);
}
catch (DiscoveryException e)
{
throw new OpenIDConsumerException("Error during discovery", e);
}
DiscoveryInformation information = consumerManager.associate(discoveries);
HttpSession session = req.getSession(true);
session.setAttribute(DiscoveryInformation.class.getName(), information);
AuthRequest authReq;
try
{
authReq = consumerManager.authenticate(information, returnToUrl, realm);
// check for OpenID Simple Registration request needed
if (attributesByProvider != null || defaultAttributes != null)
{
//I set the attributes needed for getting the email of the user
}
}
catch (Exception e)
{
throw new OpenIDConsumerException("Error processing ConumerManager authentication", e);
}
return authReq.getDestinationUrl(true);
Als nächstes habe ich die Parameter aus der HTTP-Anforderung erhalten und in der openid.claimed_id Eigenschaft I erhalten „ http: // domain.com/openid?id= ....“und wenn ich versuche, die Antwort consumerManager.verify(receivingURL.toString(), openidResp, discovered);
eine Ausnahme ausgelöst wird, um zu überprüfen:. org.openid4java.discovery.yadis.YadisException: 0x706: GET failed on http://domain.com/openid?id=... : 404:Not Found
Um die Ausnahme zu vermeiden Ich habe versucht, die Parameterliste zu ändern, um den Wert zu ändern „ http://domain.com/ ? openid id = .... "auf" https: / /www.google.com/a/domain.com/openid?id= .... "
// extract the receiving URL from the HTTP request
StringBuffer receivingURL = request.getRequestURL();
String queryString = request.getQueryString();
// extract the parameters from the authentication response
// (which comes in as a HTTP request from the OpenID provider)
ParameterList openidResp = new ParameterList(request.getParameterMap());
Parameter endPoint = openidResp.getParameter("openid.op_endpoint");
if (endPoint != null && endPoint.getValue().startsWith("https://www.google.com/a/"))
{
Parameter parameter = openidResp.getParameter("openid.claimed_id");
if (parameter != null)
{
String value = "https://www.google.com/a/" + parameter.getValue().replaceAll("http://", "");
openidResp.set(new Parameter("openid.claimed_id", value));
queryString = queryString.replaceAll("openid.claimed_id=http%3A%2F%2F", "openid.claimed_id=https%3A%2F%2Fwww.google.com%2Fa%2F");
}
parameter = openidResp.getParameter("openid.identity");
if (parameter != null)
{
String value = "https://www.google.com/a/" + parameter.getValue().replaceAll("http://", "");
openidResp.set(new Parameter("openid.identity", value));
queryString = queryString.replaceAll("openid.claimed_id=http%3A%2F%2F", "openid.claimed_id=https%3A%2F%2Fwww.google.com%2Fa%2F");
}
}
if ((queryString != null) && (queryString.length() > 0))
{
receivingURL.append("?").append(queryString);
}
// retrieve the previously stored discovery information
DiscoveryInformation discovered = (DiscoveryInformation) request.getSession().getAttribute(DiscoveryInformation.class.getName());
// verify the response
VerificationResult verification;
Map userDetails = new HashMap();
try
{
verification = consumerManager.verify(receivingURL.toString(), openidResp, discovered);
// check for OpenID Simple Registration request needed
if (attributesByProvider != null || defaultAttributes != null)
{
//Here I get the value of requested attributes
}
}
catch (Exception e)
{
throw new OpenIDConsumerException("Error verifying openid response", e);
}
// examine the verification result and extract the verified identifier
Identifier verified = null;
if (verification != null)
{
verified = verification.getVerifiedId();
}
OpenIDAuthenticationToken returnToken;
List attributes = null;
if (verified != null)
returnToken = new OpenIDAuthenticationToken(OpenIDAuthenticationStatus.SUCCESS, verified.getIdentifier(), "some message", attributes);
else
{
Identifier id = discovered.getClaimedIdentifier();
return new OpenIDAuthenticationToken(OpenIDAuthenticationStatus.FAILURE, id == null ? "Unknown" : id.getIdentifier(), "Verification status message: [" + verification.getStatusMsg() + "]", attributes);
}
Nun wird das Verfahren consumerManager.verify
wirft nicht mehr Ausnahme, sondern sein Status geändert wird fehlgeschlagen. Im Protokoll werden die folgenden Fehler
09:46:45,424 ERROR ConsumerManager,http-80-1:1759 - No service element found to match the ClaimedID / OP-endpoint in the assertion.
09:46:45,428 ERROR ConsumerManager,http-80-1:1183 - Discovered information verification failed.
Ich sah in einem Forum ein ähnliches Problem, aber die Lösung war zu ändern consumerManager.verify
zu consumerManager.verifyNonce
. Ich bin nicht sicher, ob diese Methode, wenn verwendet, wird nicht ein Sicherheitsproblem schaffen. Haben Sie eine Ahnung, was soll ich ändern meine OpenID Verbraucher an die Arbeit mit Google Apps machen OpenID?
Lösung
Google Apps verwendet einen etwas anderen Entdeckungsprozess als das, was in der Basisversion von OpenID4Java unterstützt wird. Es gibt ein Add-on-Bibliothek unter http://code.google.com/p/step2/, dass Sie vielleicht nützlich kämpfen (und eine höhere Ebene Wrapper unter http://code.google.com / p / openid-Filter / .)
Ich bin mir nicht bewusst, dass jemand Spring Security Integration mit den modifizierten Schritt 2 Klassen getan hat, aber es sollte nicht allzu schwierig sein, den Code zu ändern Schritt 2 entsprechend einzurichten. Es ist gebaut auf OpenID4Java und der Code eine vertrauende Partei ist meist das gleiche zu schreiben.