Google API - 来自Oauth2的令牌请求返回HTTP代码400的“invalid_request”

时间:2014-01-05 14:28:42

标签: oauth-2.0 google-oauth

我知道同样的问题已被多次询问,但即使在关注每一篇文章以及尝试各种建议之后,我仍然面临invalid_request错误。

我能够从Google API成功获取代码,当我尝试访问accessToken时,我收到此错误,并且从Google API发送的HTTP代码为400

我已经尝试过将我的数据与oauthplayground进行比较,似乎一切都相同

以下数据正从我的应用程序发送到Google API

https://accounts.google.com/o/oauth2/auth?
scope=openid+profile+email
&response_type=code
&redirect_uri=http%3A%2F%2Fsavealifetoday.org%2Fblood_donors%2FoAuthCallBackAction%3Fservice_provider_name%3D
&approval_prompt=force
&client_id=193214746340-ea0nq5alpst82n2fno13s9j21pn4f4pf.apps.googleusercontent.com

访问令牌网址

https://accounts.google.com/o/oauth2/token?
scope=openid+profile+email
&client_secret=***********
&grant_type=authorization_code
&redirect_uri=http%3A%2F%2Fsavealifetoday.org%2Fblood_donors%2FoAuthCallBackAction%3Fservice_provider_name%3D
&code=4%2F8veoAnihzkao58oWvZaRShn5nhYg.0to7Or-lHPwRXE-sT2ZLcbTblHXFhgI
&client_id=193214746340-ea0nq5alpst82n2fno13s9j21pn4f4pf.apps.googleusercontent.com

但是当应用程序试图通过网络获取数据时,我正在获得异常

SEVERE: Error while fetching access token for Google..
OAuthProblemException{error='invalid_request', description='null', uri='null', state='null', scope='null', redirectUri='null', responseStatus=0, parameters={}}

我正在使用URLConnectionClient建立网络连接

2 个答案:

答案 0 :(得分:3)

使用OAuth操场https://developers.google.com/oauthplayground/浏览OAuth流程。

然后将发送的内容与您自己的内容进行比较。

请注意,它必须是HTTP POST。您发布的代码看起来像GET。

此外,您的重定向网址看起来有点奇怪。 完全与您在API控制台中注册的URL相同吗?这不是您当前的错误,但可能会成为您的下一个错误; - )

答案 1 :(得分:1)

您似乎忘记在此处发送'state'参数(这是强制性的!):

https://accounts.google.com/o/oauth2/auth?
scope=openid+profile+email
&response_type=code
&redirect_uri=http%3A%2F%2Fsavealifetoday.org%2Fblood_donors%2FoAuthCallBackAction%3Fservice_provider_name%3D
&approval_prompt=force
&client_id=193214746340-ea0nq5alpst82n2fno13s9j21pn4f4pf.apps.googleusercontent.com

在Java代码中,您可以通过以下方式生成它:

String state = new BigInteger(130, new SecureRandom()).toString(32);

所以你的要求应该是这样的:

https://accounts.google.com/o/oauth2/auth?
scope=openid+profile+email
&response_type=code
&redirect_uri=http%3A%2F%2Fsavealifetoday.org%2Fblood_donors%2FoAuthCallBackAction%3Fservice_provider_name%3D
&approval_prompt=force
&client_id=193214746340-ea0nq5alpst82n2fno13s9j21pn4f4pf.apps.googleusercontent.com
&state= {insert_here_generated_state}

而且我也不知道是否有必要在“访问令牌URL”中发送'scope'参数。