2017-02-23 13 views
7

私のフロントエンドアプリケーションはです。 gmailアカウントを使用して認証されました。ノードjsのサーバー側でgoogle authトークンを確認するにはどうすればよいですか?

私は、認証が成功した後id_tokenを取得し、トークンベアラとしてとして認証ヘッダーを送信します。

など。 http://localhost:4000/api

認可のベアラnodejsサーバ側で

をtoken_id、私はトークンを確認するには、次のメソッドを呼び出します。私は上記のメソッドを呼び出すと、私は常にエラーを以下に無効なトークン応答を取得

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.verifyIdTokenlibrary sourceから、引数でidTokenを取る:

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 ?

:あなたは全体のヘッダー値 bearer eyJhbGciOiJSUzI1NiIsImtpZCI6ImMxYWI1OD U3MDY2NDQyZWEwMWEwMTYwMTg1MDc3MDY3NjQ2MGE3MTIifQに合格した

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

ので、あなたのように、ヘッダーの値を分割する必要があります

はい、これはトークンを確認する正しい方法です。あなたは疑問がある場合や、デバッグのために、あなたも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?

あなたはAuthorizationヘッダーにJWTトークンを送信することができますが、あなたはmultiple Authorization headersを持っている場所、それがユースケースにつながる可能性。 URLエンコード、または本体にトークンを埋め込むことをお勧めします。あなたは、Googleが必要とされた後、さらにGoogleの例here

を確認することができます。

  • トークンは、HTTPS POSTを介して送信されなければならない
  • トークンの整合性が検証されなければならない

を最適化するにはトークンを検証するたびに再定義するのではなく、アプリのルートにあるapp.jsにGoogle authオブジェクトを移動することもできます。 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トークンを送信できますが、問題はありません" - しかし、これは認証ヘッダーではなく、認証用です。誰かが同時に(認証と承認)の両方を送信する必要がある場合はどうなりますか? –

関連する問題