Curl 谷歌OAuth2';s";代码“;响应不';行不通
我实现了Google的oauth2按钮,这个按钮运行得很好。然而,后来我想定制它,这就是我遇到麻烦的地方 我目前在HTML页面上有一个简单的锚Curl 谷歌OAuth2';s";代码“;响应不';行不通,curl,oauth-2.0,google-oauth,Curl,Oauth 2.0,Google Oauth,我实现了Google的oauth2按钮,这个按钮运行得很好。然而,后来我想定制它,这就是我遇到麻烦的地方 我目前在HTML页面上有一个简单的锚 当用户点击这个ancher时,他将被带到Google的auth页面。该页面将用代码重定向到我的servlet。我的servlet将使用此代码获取访问令牌 “代码”如下所示: 4/0AY0e-G6BDL0EJAWBMOV2XOHWV2NTPAUQ——wHPvZUiW_4bx26vu-bx1NGEngz29RKboQ 这很有效。为了简单起见,我不会粘贴J
当用户点击这个ancher时,他将被带到Google的auth页面。该页面将用代码重定向到我的servlet。我的servlet将使用此代码获取访问令牌
“代码”如下所示:
4/0AY0e-G6BDL0EJAWBMOV2XOHWV2NTPAUQ——wHPvZUiW_4bx26vu-bx1NGEngz29RKboQ
这很有效。为了简单起见,我不会粘贴Java代码,我将向您展示curl
命令,因为它的工作原理完全相同
curl -v -H "Origin: https://localhost:8080" -H "Content-Type: application/x-www-form-urlencoded" \
-X POST --data-urlencode "client_id=myclientid" \
--data-urlencode "client_secret=mysecret" \
--data-urlencode "redirect_uri=http://localhost:8080/google/auth" \
--data-urlencode "grant_type=authorization_code" \
--data-urlencode "code=4/0AY0e-g6bddl0EjaWbmov2ExohWV2NTPAbUQ--wHPvZUiW_4bx26vu-bx1NGEngz29RKboQ" \
https://oauth2.googleapis.com/token
此curl
命令有效。我会得到这样的回复:
{
“访问令牌”:“已编辑”,
“expires_in”:3578,
“范围”:“openid”https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile",
“令牌类型”:“承载者”,
“id_标记”:“已编辑”
}
好的,这就是我的麻烦开始的地方。除了HTML锚之外,我还想添加使用javascript登录的功能。是的,我知道有很多方法可以做到这一点,我希望做到如下:
函数onGLoad(){
log('loadinggoogleplatform…');
load('auth2',function(){
gapi.auth2.authorize({
客户端id:“”,
范围:“配置文件电子邮件”,
响应类型:“代码”,
提示:“无”
},功能(回应){
if(response.error){
log('Google响应错误:'+response.error);
}else if(response.code){
//用代码重定向到servlet
var redirectUrl='/google/auth?state=&code='+encodeURIComponent(response.code);
window.location.replace(重定向URL);
}
});
});
}
如果用户尚未注销,我们将返回一段代码,并将重定向到与用户单击锚时相同的servlet。再次强调这是同一个servlet是很重要的。因此,如果通过HTML锚登录有效,那么这也应该有效,因为Java代码完全相同
curl -v -H "Origin: https://localhost:8080" -H "Content-Type: application/x-www-form-urlencoded" \
-X POST --data-urlencode "client_id=myclientid" \
--data-urlencode "client_secret=mysecret" \
--data-urlencode "redirect_uri=http://localhost:8080/google/auth" \
--data-urlencode "grant_type=authorization_code" \
--data-urlencode "code=4/0AY0e-g6bddl0EjaWbmov2ExohWV2NTPAbUQ--wHPvZUiW_4bx26vu-bx1NGEngz29RKboQ" \
https://oauth2.googleapis.com/token
不管怎样,它不起作用。我可以用curl
重现该问题。Javascript获得一个代码,我将该代码输入到我上面编写的同一个curl命令中。谷歌的答案是:
{
“错误”:“重定向\u uri\u不匹配”,
“错误描述”:“错误请求”
}
我确信重定向uri是正确的,因为它与curl
命令完全相同。如果它对上一个命令有效,为什么现在不起作用?我还想提到,我尝试了重定向uri的所有组合,是的,它们与我在Google开发者控制台中看到的完全相同。我怀疑问题不在重定向uri中,而是在其他地方
我从Javascript获得的“代码”如下所示:
4/0AY0e-g5mAb-8s——Oh9xkiaIYr0Sis1ibJZWq3K6E\u Pf\u RsTERyb6Z4OUrOIrj-FHXKULA
你可以看到它的格式和长度与我点击锚时得到的代码相同
你认为这是怎么回事?这是谷歌认证服务器中的一个bug吗