redirect_uri_mismatch与Google登录服务器端应用程序

时间:2017-11-14 13:25:23

标签: node.js google-signin googlesigninapi googlesigninaccount

我的Google登录有问题。 我按照Google Sign-In for server-side apps上的步骤操作 完成所有这一步后,我有一个在服务器上运行的html文件:

<!DOCTYPE html>
<html itemscope itemtype="http://schema.org/Article">
    <head>
        <link rel="stylesheet" href="theme.css">
        <!-- BEGIN Pre-requisites -->
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
        <script src="https://apis.google.com/js/client:platform.js?onload=start" async defer></script>
        <!-- END Pre-requisites -->
        <script>
            function start() {
                gapi.load('auth2', function() {
                    auth2 = gapi.auth2.init({
                        client_id: 'CLIENT_ID'
                    });
                });
            }
        </script>
    </head>
    <body>
        <button id="googleBtn">Connect</button>
        <script>
            $('#googleBtn').click(function() {
                auth2.grantOfflineAccess().then(googleCallback);
            });
        </script>
        <script>
            function googleCallback(authResult) {
                if (authResult['code']) {
                    console.log(authResult);
                } else {
                    console.log(authResult);
                }
            }
        </script>
    </body>
</html>

这第一部分工作完美(我认为),当我点击按钮,一个窗口弹出窗口,我选择一个帐户,然后我得到一个代码。所以现在,我想获取电子邮件和个人资料,因此我在nodejs中发出此请求以使用访问令牌交换代码。

var form = {
    code: 'XXXXXXXXXXXX',
    client_id: 'CLIENT_ID,
    client_secret: 'CLIENT',
    grant_type:'authorization_code'
};

var formData = querystring.stringify(form);
var contentLength = formData.length;

request({
    headers: {
      'Content-Length': contentLength,
      'Content-Type': 'application/x-www-form-urlencoded'
    },
    uri: 'https://www.googleapis.com/oauth2/v4/token',
    body: formData,
    method: 'POST'
  }, function (err, rep, body) {
    console.log(err);
    console.log(rep.statusCode);
    console.log(body);
  });

但作为回应,我有这个

{
 "error": "redirect_uri_mismatch",
 "error_description": "Bad Request"
}

我不明白为什么,因为我不会在html文件中的主要请求中使用任何redirect_uri。我尝试了一些例如在Console API和请求中添加redirect_uri的情况,但我有相同的结果......

你能帮助我吗?

2 个答案:

答案 0 :(得分:1)

您需要通过console.developer.google.com

为Google定义回调网址

因此,您需要按照以下步骤定义回调网址:

  1. 转到console.developer.google.com
  2. 选择您的项目。
  3. 点击“凭据”&#39;在左侧菜单上。
  4. 在“OAuth 2.0客户端ID&#39;上点击您的客户端列表。
  5. 将您的回调网址添加到&#39;授权重定向URI&#39;列表。
  6. 完成了。

答案 1 :(得分:0)

在客户端auth2.grantOfflineAccess进程中,要在服务器上获取accessToken,必须在请求参数中传递redirect_uri=postmessage

根据您的示例:

var form = {
  code: 'XXXXXXXXXXXX',
  client_id: 'CLIENT_ID,
  client_secret: 'CLIENT',
  grant_type:'authorization_code',
  redirect_uri: 'postmessage' // the line to add
};