2017-02-23 44 views
7

Мое приложение переднего конца аутентифицировано с использованием учетной записи gmail.Как проверить токен google auth на стороне сервера в узле js?

я получить id_token после успешной аутентификации и отправить его в качестве авторизации заголовка в носитель маркера.

E.g. http://localhost:4000/api

Авторизация Bearer token_id

В 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_modules\google-auth-libr 
ary\lib\auth\oauth2client.js:518:13) 
  • Является ли это правильный подход для проверки маркера?
  • Отправлять ли id_token в качестве носителя авторизации? Или это только для авторизации?
  • Как отправить идентификатор id_token на стороне сервера? Через url, заголовок?
  • Что я делаю неправильно?

Любая помощь очень ценится.

ответ

2

OAuth2Client.verifyIdToken принимают idToken в качестве аргументов, из library source:

/** 
* 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 
} 

Is this the right approach to verify token ?

Да, это правильный способ проверки токена. Для отладки, вы можете также проверить маркер с tokeninfo конечной точки, если у вас есть какие-либо сомнения или для быстрого тестирования:

https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=XYZ123 
  • Do I send the id_token as Authorization bearer? Or is it for authorization only?
  • How do I send the id_token to the sever side? Thru url, header?

Вы можете отправить JWT маркер в заголовке Authorization, но это может привести к USECASE, где у вас есть multiple Authorization headers , Лучше всего кодировать URL или вставлять токен в тело.Вы можете проверить пример Google here

Кроме того, следующие требуется 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(...) 
+0

Пожалуйста, вы можете ответить на мой другой вопрос в посте? –

+0

Я обновил сообщение, надеюсь, что это поможет –

+0

«Вы можете отправить токен JWT в заголовок авторизации, без проблем с этим» -> Но это не заголовок авторизации, это для проверки подлинности, я думал, что подход отличается. Что делать, если кто-то должен отправлять оба (Аутентификация и авторизация) одновременно? –