Я пытаюсь реализовать простой Google Sing, следуя этой статье https://medium.com/@jackrobertscott/how-to-use-google-auth-api-with-node-js-888304f7e3a0
Загружается страница с аутентификацией Google, и я могу выбрать учетную запись, с которой я хочу войти, но после выбора учетной записи она загружается почти бесконечно, а затем выводит
(узел: 8548) UnhandledPromiseRejectionWarning: Ошибка: invalid_grant
в Gaxios.request (C: \ Users \ misha \ Documents \ JavaScriptProjects \ spa \ node_modules \ gaxios \ build \ src \ gaxios.js: 70: 23)
at process._tickCallback (внутренняя / process / next_tick.js: 68: 7)
Я использую express.js в качестве серверной платформы
Вот код моего сервера (я предоставил только необходимые части кода):
Сервер-dev.js
import googleAuthUtil from './utils/google-auth-util';
app.get('/api/v1/googlelogin',(req,res) => {
res.send(googleAuthUtil.urlGoogle());
});
app.get('/googleAuth',(req,res) => {
console.log(googleAuthUtil.getGoogleAccountFromCode(req.query.code));
});
. / Utils / Google-AUTH-util.js
import {google} from 'googleapis';
const googleConfig = {
clientId: '21263739003-l210171qijqppm4u0a0uc3b1rndfq1gj.apps.googleusercontent.com',
clientSecret: 'yWaL8LVUHh-39VCZbvNq0Ff8',
redirect: 'http://localhost:8080/googleAuth',
};
const defaultScope = [
'https://www.googleapis.com/auth/plus.me',
'https://www.googleapis.com/auth/userinfo.email',
];
function createConnection() {
return new google.auth.OAuth2(
googleConfig.clientId,
googleConfig.clientSecret,
googleConfig.redirect
);
}
function getConnectionUrl(auth) {
return auth.generateAuthUrl({
access_type: 'offline',
prompt: 'consent',
scope: defaultScope
});
}
function getGooglePlusApi(auth) {
return google.plus({version: 'v1', auth});
}
const googleUtils = {
urlGoogle: function () {
const auth = createConnection();
const url = getConnectionUrl(auth);
return url;
},
getGoogleAccountFromCode: async function (code) {
const auth = createConnection();
const data = await auth.getToken(code);
const tokens = data.tokens;
auth.setCredentials(tokens);
const plus = getGooglePlusApi(auth);
const me = await plus.people.get({userId: 'me'});
const userGoogleId = me.data.id;
const userGoogleEmail = me.data.emails && me.data.emails.length && me.data.emails[0].value;
return {
id: userGoogleId,
email: userGoogleEmail,
tokens: tokens,
};
}
};
export default googleUtils;
Мой проект представляет собой одностраничное приложение, поэтому я отображаю страницы на стороне клиента с помощью файлов js.
Вот мой код внешнего интерфейса (я предоставил только необходимые части кода):
homepage.js
async function getGoogleLoginUrl(){
const response = await fetch('/api/v1/googlelogin');
const text = await response.text();
return text;
}
let homePage = {
render: async function () {
let posts = await getPosts();
let loginUrl = await getGoogleLoginUrl();
console.log(posts[0].id);
console.log(posts[0]._id);
return `<a href="${loginUrl}">Login with google</a>`;
//my home page is basically a blank screen with a link to google login
}
};
Как я уже говорил ранее, большая часть логики работает нормально, и она падает только в самом конце 1032 *, когда я выбираю учетную запись, с которой я хочу войти в систему