1

私はGoogle's OpenIDConnect authenticationを使用しており、Googleから返されたJWT id_tokenを検証したいと考えています。ただし、IDトークンでiss(発行者)のクレームについてGoogleが返す値については、ドキュメントに一貫性がないようです。Google OpenIDConnect id_tokenの一貫した「iss」値を取得できますか?

One pageは、「ISS:常にaccounts.google.comを」と言いますが、another pageは、「IDトークンでISSの値がaccounts.google.comhttps://accounts.google.comに等しい」とサンプルコード内のコメントは、さらに説明言う:

私はAndroidアプリケーションではなくサーバー側アプリケーションを使用しているため、Playサービスは使用していません。

実装者は、必要を省くGoogleの展開のOpenIDを接続し、実装上の問題のIDトークン、この記事の執筆時点のように、それを意識する必要があります。

海域さらに泥だらけに、the OpenIDConnect specification itselfはそのノートが含まれていますhttps:// iss(発行者)クレーム値からのスキーム接頭辞。したがって、Googleと連携したいと望んでいる依拠当事者の実装は、その実装が更新されるまで、これを回避するコードを持つ必要があります。そのような回避コードは、Googleが発行者の値に欠落しているプレフィックスを追加するような方法で書き込まれないように記述する必要があります。

その文書はそれ以来の時間では11月8日、2014日付けされ、Googleがiss値を標準化している、または私は実際にそれらの両方をチェックする必要がありますか?上記のコメントは、Playサービス> = 8.3のみがisshttps://となることを示しています。それ以外の場合は値がaccounts.google.comになります。本当?

答えて

0

まずは、Googleのドキュメントは不透明なビジネスだと確信しています。

、サーバー側のIDトークンの整合性を検証することが可能ないくつかの異なる方法があります(ところで thisあなたが探しているページがある)されている

  1. 「手動」 - 常にGoogleの公開鍵をダウンロードし、署名を確認してから、issを含む各フィールドを確認します。主な利点(私の意見では小さなものだが)は、Googleに送信されるリクエストの数を最小限に抑えることができるということを理解している。
  2. は「自動的に」 - 最も簡単なはるか - このトークンを検証するために、GoogleのエンドポイントでGETを実行します。 https://www.googleapis.com/oauth2/v3/tokeninfo?id_token={0}
  3. GoogleのAPIクライアントライブラリを使用して - オーバーヘッドがそれだけの価値はないかもしれない、C#は公式を持っていません1つなど

2番目のオプションを使用して、Googleが検証アルゴリズムを心配することをお勧めします。

+0

このページでは、現時点では「IDトークンのissの値は、accounts.google.comまたはhttps:// accounts.google.com」と同じです。 –

+0

が合意した。もしあなたがその道を行くとすれば、おそらく両方の可能性をチェックしなければならないだろう。 –

+1

おかげさまで、私の質問には答えられません。なぜなら、あなたはGoogleのid_tokenを検証する方法を一般的に話しているからです。私は特に 'iss'フィールドについて質問しています。 「いいえ、一貫した価値を得る方法がないので、両方の可能性をチェックするだけです」 – bjmc

0

両方の可能性をチェックする必要があります。これは私のために働いたものです...

発行者を取得するトークンをデコードします。発行者がhttps://accounts.google.comまたはaccounts.google.comのいずれかに等しくない場合は、そこで停止することができます。無効なトークンです。

発行者が上記のGoogleストリングのいずれかと等しい場合は、同じデコードされた発行者の値を検証ステップに渡します。この関数はjsonwebtokenjwk-to-pemノードモジュールを使用しています

function authorize(req, res, next) { 
    try { 
     var token  = req.headers.authorization; 
     var decoded  = jwt.decode(token, { complete: true }); 
     var keyID  = decoded.header.kid; 
     var algorithm = decoded.header.alg; 
     var pem   = getPem(keyID); 
     var iss   = decoded.payload.iss; 

     if (iss === 'accounts.google.com' || iss === 'https://accounts.google.com') { 
      var options = { 
       audience: CLIENT_ID, 
       issuer: iss, 
       algorithms: [algorithm] 
      } 

      jwt.verify(token, pem, options, function(err) { 
       if (err) { 
        res.writeHead(401); 
        res.end(); 
       } else { 
        next(); 
       } 
      });    

     } else { 
      res.writeHead(401); 
      res.end(); 
     } 
    } catch (err) { 
     res.writeHead(401); 
     res.end(); 
    } 
} 

注:以下の

は、私はいくつかのNode.js ExpressのミドルウェアのためにJavaScriptで書いた実装です。最終的にjsonのWebキーをpem形式に変換する関数 getPemの詳細は省略しました。

関連する問題