在来自Node.js客户端的第一个请求中,Google OAuth2登录失败

时间:2019-04-30 14:53:01

标签: node.js oauth-2.0 google-signin

我正在尝试在Node.js服务器上实现“通过Google登录”。我在GCP控制台中创建了一个Web客户端,并获得了客户端名称和ID。一切正常,但是我无法理解为什么第一个请求失败的原因。我正在使用“ googleapis”库来构建我的Node.js OAuth客户端:

/* set-up the oauth client */
const oauth2Client = new google.auth.OAuth2(
  'xxxxxxxxx',
  'yyyyyyyyy',
  'https://evening-coast-89425.herokuapp.com/google-auth'
);

/* set-up the scope of request */
const scopes = [
  'https://www.googleapis.com/auth/plus.me',
  'https://www.googleapis.com/auth/userinfo.email',
];

/* generate web-client specific Google sign-in URL */
const url = oauth2Client.generateAuthUrl({
  // 'online' (default) or 'offline' (gets refresh_token)
  access_type: 'offline',
  scope: scopes
});

在这里,如您所见,在我的服务器代码中,从Google的重定向设置为/google-auth路由,我将按以下方式进行处理:

app.get('/google-auth', async function(req, res) {

  var url_parts = url1.parse(req.url, true);
  var query = url_parts.query;
  var code = query.code;
  console.log("Code: " + code);

  const {tokens} = await (oauth2Client.getToken(code));
  oauth2Client.setCredentials(tokens);

  oauth2Client.on('tokens', (tokens) => {
    if (tokens.refresh_token) {
      // store the refresh_token in my database!
      console.log("Refresh token: " + tokens.refresh_token);
    }
    console.log("Login token: " + tokens.access_token);

    try {
      plus.people.get({ userId: 'me', auth: oauth2Client }, function(err, response) {
          //console.log("response : ", JSON.stringify(response));
          //resolve(response || err);
          console.log(response.data.emails[0].value);
          console.log(response.data.displayName);
          console.log(response.data.id);
          console.log(response.data.image.url);

          res.status(200).send('Yes');

      });
    } catch(err) {
      console.log("Error occured: " + err);
    }
  });
});

当我向生成的Google登录URL(url)发送请求时,我从Google收到一个“代码”作为重定向URL中的请求参数。然后使用该代码获取登录令牌,并最终获取用户配置文件。第一次发送请求时,我确实得到了代码,但是请求超时。第二次刷新时,我确实获得了另一个代码,登录令牌和用户个人资料详细信息。谁能解释我在这里做错了什么?非常感谢您的帮助。

0 个答案:

没有答案