Я пытаюсь реализовать «Вход через Google» на сервере Node.js.Я создал веб-клиент в консоли GCP и получил имя и идентификатор клиента.Это работает нормально, но я не могу понять, почему запрос не был выполнен для первого запроса.Я использую библиотеку 'googleapis' для создания моего клиента OAuth Node.js:
/* 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);
}
});
});
Когда я отправляю запрос на сгенерированный URL для входа в Google (url
), я получаю «код» от Google в качестве параметра запроса в URL-адресе перенаправления.Затем этот код используется для получения токена для входа и, в конечном итоге, профиля пользователя.Когда я отправляю запрос в первый раз, я получаю код, но затем время ожидания истекает.Во второй раз, когда я обновляюсь, я получаю другой код, токен для входа и данные профиля пользователя.Может кто-нибудь объяснить, что я здесь делаю не так?Большое спасибо за помощь.