我知道同样的问题已被多次询问,但即使在关注每一篇文章以及尝试各种建议之后,我仍然面临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
建立网络连接
答案 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'参数。