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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top