7

我正在使用来自 Apache 的 Oltu 库,并且正在尝试使用 OAuth2 通过 Google 进行身份验证。以下是相关代码:

OAuthAuthzResponse oar = OAuthAuthzResponse.oauthCodeAuthzResponse(request);
OAuthClientRequest clientReq = OAuthClientRequest
    .tokenProvider(OAuthProviderType.GOOGLE)
    .setClientId("<my-client-id>")
    .setClientSecret("<my-client-secret>")
    .setRedirectURI("https://test.example.com/oauthtest/oauth/google/auth")
    .setCode(oar.getCode())
    .setGrantType(GrantType.AUTHORIZATION_CODE)
    .buildQueryMessage();

OAuthClient oAuthClient = new OAuthClient(new URLConnectionClient());

// This call fails with the OAuthProblemException
OAuthAccessTokenResponse oAuthResponse = oAuthClient.accessToken(clientReq, 
        OAuthJSONAccessTokenResponse.class);

我可以毫无问题地通过 Facebook 进行身份验证,但无论出于何种原因,这都失败了。我可以毫无问题地从 OAuthAuthzResponse 获取代码,所以我知道原始调用正在运行,但是这个后续调用失败了。


编辑:我已经放弃使用 Oltu 并坚持使用 HttpClient 库和手动执行 OAuth 舞蹈的更简单方法。它对我来说效果更好,我会将它推荐给任何想要可靠地针对多个 OAuth 提供者进行身份验证的人。只有 Twitter 要求我使用Scribe

4

2 回答 2

4

Google 的 OAuth2 在 HTTP POST 方法的主体中发送参数,而不是查询字符串。

尝试用 buildBodyMessage() 方法替换 buildQueryMessage()。

于 2014-04-16T21:25:06.343 回答
1

我有一个 Spring OAuth2 和 Google 集成程序,我可以在其中访问受保护的资源,如用户配置文件等。

我认为您需要重构代码以使用以下代码:

OAuthClientRequest request = OAuthClientRequest
                .authorizationLocation("https://accounts.google.com/o/oauth2/auth")
                .setClientId("")
                .setRedirectURI("https://test.example.com/oauthtest/oauth/google/auth")
                .setResponseType("code")
                .setScope("https://www.googleapis.com/auth/plus.login https://www.googleapis.com/auth/plus.profile.emails.read https://www.googleapis.com/auth/plus.me")
                .buildQueryMessage();

此外,当您处理回调时,您需要确保发送您需要为 setCode("") 设置的“secret”、“TokenLocation”、“RedirectURI”和高于“code”值

请参考我在Apache Oltu Spring Security OAuth2 和 Google Integration中对您的查询的回答。确保您的代码详细信息正确到位。

于 2015-04-06T19:38:47.780 回答