Как проверить токен Google auth на стороне сервера в узле js?
мое приложение переднего плана проверкой подлинности использование учетной записи gmail.
восстановить маркер после успешной аутентификации и отправьте его как Заголовок as маркер на предъявителя.
Е. Г. http://localhost:4000/api
Разрешения На Предъявителя token_id
At nodejs сторона сервера, я вызываю следующий метод для проверки знак.
exports.verifyUser = function(req, res, next) {
var GoogleAuth = require('google-auth-library');
var auth = new GoogleAuth();
var client = new auth.OAuth2(config.passport.google.clientID, config.passport.google.clientSecret, config.passport.google.callbackURL);
// check header or url parameters or post parameters for token
var token = "";
var tokenHeader = req.headers["authorization"];
var items = tokenHeader.split(/[ ]+/);
if (items.length > 1 && items[0].trim().toLowerCase() == "bearer") {
token = items[1];
}
if (token) {
var verifyToken = new Promise(function(resolve, reject) {
client.verifyIdToken(
token,
config.passport.google.clientID,
function(e, login) {
console.log(e);
if (login) {
var payload = login.getPayload();
var googleId = payload['sub'];
resolve(googleId);
next();
} else {
reject("invalid token");
}
}
)
}).then(function(googleId) {
res.send(googleId);
}).catch(function(err) {
res.send(err);
})
} else {
res.send("Please pass token");
}
}
когда я вызываю метод, я всегда получаю недопустимый маркер ответ со следующей ошибкой.
Error: No pem found for envelope: {"alg":"RS256","kid":"c1ab5857066442ea01a01601
850770676460a712"}
at OAuth2Client.verifySignedJwtWithCerts (node_modulesgoogle-auth-libr
arylibauthoauth2client.js:518:13)
- это правильный подход для проверки токена?
- отправить маркер в качестве носителя авторизации? Или это только для авторизации?
- как отправить id_token на сторону север? Через url, заголовок?
- что я делаю не так?
любая помощь будет высоко оцененный.
1 ответов
OAuth2Client.verifyIdToken
взять сведения об идентификаторе маркера в аргументы, начиная от источник библиотека :
/**
* Verify id token is token by checking the certs and audience
* @param {string} idToken ID Token.
* @param {(string|Array.<string>)} audience The audience to verify against the ID Token
* @param {function=} callback Callback supplying GoogleLogin if successful
*/
OAuth2Client.prototype.verifyIdToken = function(idToken, audience, callback)
вы передали все значение заголовка bearer eyJhbGciOiJSUzI1NiIsImtpZCI6ImMxYWI1OD
U3MDY2NDQyZWEwMWEwMTYwMTg1MDc3MDY3NjQ2MGE3MTIifQ
таким образом, вам придется разделить значение заголовков как :
var authorization = req.headers["authorization"];
var items = authorization.split(/[ ]+/);
if (items.length > 1 && items[0].trim() == "Bearer") {
var token = items[1];
console.log(token);
// verify token
}
это правильный подход для проверки токена ?
Да, это правильный способ проверки токена. Для отладки вы также можете проверить токен с конечной точкой tokeninfo, если у вас есть какие-либо сомнения или для быстрого тестирования :
https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=XYZ123
- отправить маркер в качестве носителя авторизации? Или это для только разрешение?
- как отправить id_token на сторону север? Через URL-адрес, заголовок?
вы можете отправить токен JWT в заголовке авторизации, но это может привести к usecase, где у вас есть несколько заголовков авторизации. Лучше всего кодировать URL-адрес или вставлять маркер в тело. Вы можете проверить пример Google здесь
кроме того, Google требует следующее:
- токен должен быть отправлен через HTTPS POST
- целостность маркера должна быть проверена
чтобы оптимизировать код, вы также можете переместить свой Google auth
возражать против вашего app.js
в корне вашего приложения вместо того, чтобы переопределять его каждый раз, когда маркер должен быть проверен. В app.js
:
var app = express();
var GoogleAuth = require('google-auth-library');
var auth = new GoogleAuth();
app.authClient = new auth.OAuth2(config.passport.google.clientID, config.passport.google.clientSecret, config.passport.google.callbackURL);
и verifyUser
звонок от req.app.authClient
:
req.app.authClient.verifyIdToken(...)