我正在尝试在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中的请求参数。然后使用该代码获取登录令牌,并最终获取用户配置文件。第一次发送请求时,我确实得到了代码,但是请求超时。第二次刷新时,我确实获得了另一个代码,登录令牌和用户个人资料详细信息。谁能解释我在这里做错了什么?非常感谢您的帮助。