Curl 谷歌OAuth2';s";代码“;响应不';行不通

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

我实现了Google的oauth2按钮,这个按钮运行得很好。然而,后来我想定制它,这就是我遇到麻烦的地方

我目前在HTML页面上有一个简单的锚


当用户点击这个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登录的功能。是的,我知道有很多方法可以做到这一点,我希望做到如下:

  • javascript尝试验证用户身份
  • 如果成功,将返回一个代码
  • javascript将用户重定向到我的servlet
  • 以下是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吗