2010-11-19 7 views
7

Ich versuche, mit Google Apps öffnen ID mit OpenID4Java-Bibliothek anmelden.Spring Security 3.0 Google Apps offene ID anmelden mit OpenID4Java

entdecke ich den Dienst des Benutzers 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); 
 

Next 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); zu überprüfen, wird eine Ausnahme ausgelöst: org.openid4java.discovery.yadis.YadisException: 0x706: GET failed on http://domain.com/openid?id= ... : 404:Not Found.

die Ausnahme zu vermeiden, habe ich versucht, die Parameterliste Ändern Sie den Wert „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 werfen consumerManager.verify nicht mehr Ausnahme zu ändern, aber sein Status wird in fehlgeschlagen geändert. 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. 
 

sah ich in einem Forum ein ähnliches Problem, aber die Lösung war consumerManager.verify-consumerManager.verifyNonce zu ändern. Ich bin mir nicht sicher, ob die Verwendung dieser Methode kein Sicherheitsproblem verursacht. Haben Sie eine Idee, was ich ändern sollte, damit meine Open ID-Nutzer mit Google Apps OpenID arbeiten können?

Antwort

0

Google Apps verwendet einen etwas anderen Erkennungsprozess als in der Basisversion von OpenID4Java. Es gibt eine Add-on-Bibliothek unter http://code.google.com/p/step2/, die Sie möglicherweise nützlich kämpfen (und eine höhere Ebene Wrapper

) Ich bin nicht bewusst, jemand, der Spring Security Integration mit den modifizierten Step2-Klassen getan hat, aber es sollte nicht t zu schwer, den Code zu ändern, um Step2 entsprechend einzurichten. Es ist auf OpenID4Java aufgebaut und der Code zum Schreiben einer vertrauenden Partei ist meistens gleich.