2010-11-19 12 views
7

'u kullanarak açık kimlik girişini açın OpenID4Java kütüphanesiyle Google Apps açık kimliğini kullanarak giriş yapmayı deneyin. AldığımSpring Security 3.0 Google Apps, OpenID4Java

 

     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); 
 

Sonraki ben http isteğinden ve openid.claimed_id özelliğinde parametreleri olsun "http://domain.com/openid?id= ....":

Ben tüketici sınıfında aşağıdaki kodu kullanarak kullanıcının servisini keşfetmek ve consumerManager.verify(receivingURL.toString(), openidResp, discovered); yanıtını doğrulamaya çalışırsam bir istisna atılır: org.openid4java.discovery.yadis.YadisException: 0x706: GET failed on http://domain.com/openid?id= ... : 404:Not Found.

ben değerini değiştirerek parametre listesini değiştirmeye çalıştı istisna önlemek için "http://domain.com/openid?id= ...." den "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); 
     } 
 

Şimdi yöntem consumerManager.verify artık istisna atma değil, ancak durumu başarısız olarak değiştirildi. günlüğünde aşağıdaki hatalar bir forum benzer bir sorun gördük, ama çözüm consumerManager.verifyNonce için consumerManager.verify değiştirmekti

 

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. 
 

görünür. Bu yöntemi kullanmanın bir güvenlik sorunu oluşturmayacağından emin değilim. Açık kimlik tüketicimin Google Apps openid ile çalışmasını sağlamak için neleri değiştirmem gerekir?

cevap

0

Google Apps, OpenID4Java'nın temel sürümünde desteklenenlerden biraz farklı bir keşif işlemi kullanıyor. 'Orada kullanışlı savaşır belki http://code.google.com/p/step2/ kütüphanede bir eklenti-

Değiştirilmiş Adım2 sınıfları ile Bahar Güvenlik entegrasyonu yapmış olan herkes farkında değilim (ve http://code.google.com/p/openid-filter/ daha yüksek bir seviyede sarıcı.), Ama yapmaman Adım 2'yi uygun şekilde kurmak için kodu değiştirmek çok zor olabilir. OpenID4Java üzerine inşa edilmiştir ve bağlı bir parti yazmanın kodu çoğunlukla aynıdır.