44

ノードエクスプレスアプリでユーザーを認証するためにGoogle OAuthを使用しようとして、ここでかなりの時間を過ごしています。次のような応答を返す OAuth を正常に実行できます。

{
  access_token: 'token string',
  id_token: 'id.string',
  expires_in: 3599,
  token_type: "Bearer"
}

これはすべて理にかなっていますが、私の人生では、JWT をデコードする方法を理解することはできません。私はこれらすべてに少し慣れていないので、これは私にとって少し異質です。

ここにリストされている手順に従ってください: https://developers.google.com/accounts/docs/OAuth2Login#validatinganidtokenノード アプリで JWT をローカルにデコードしようとしています。

ノード環境にhttps://github.com/hokaccha/node-jwt-simpleをインストールしました。

そして、この証明書 ( https://www.googleapis.com/oauth2/v1/certs ) を何らかの方法でデコードするために使用する必要があると確信していますが、ここで少し途方に暮れています。ノードアプリに証明書を取得する方法と、その後 node-jwt-simple で証明書を使用する方法がよくわかりません。また、キャッシュされた証明書を使用する場合と比較して、新しい証明書をプルする必要がある場合をどのように知るかについてもよくわかりません。

私を助けることができるこの経験のある人はいますか?

助けてくれてありがとう。この時点で私は完全に途方に暮れています。

** アップデート **

それで、私はいくつかの進歩を遂げました...ちょっと。jwt.decode(id_token, certificate, true); を呼び出します。トークンを正常にデコードできました。証明書変数が空のオブジェクト {} であっても。これにより、まだ3つの質問が残っています。1: Google からの URL を使用して Express アプリに証明書を取得する最良の方法は何ですか? 2: 新しいバージョンを取り込む必要があるときは、どうすればわかりますか? 3: noVerify (jwt.decode の 3 番目の引数) に true を渡すのはひどい考えのようです。それを渡さずに機能させるにはどうすればよいですか?おそらく jwt-simple は hs256 を想定しており、トークンは rs256 を使用しているようです。

繰り返しますが、私はこれについて非常に経験が浅いため、ここでベースから外れている可能性があります。

* 更新 * Nat の助けのおかげで、これを機能させることができました! そこにあるすべてのJWTおよびJWSノードモジュールを試したと思います。私が最終的にたどり着いたのは次のとおりです。私が調べたモジュールのどれもが、箱から出してすぐに望んでいたことをまったくしていないことがわかりました。id_token をデコードするために使用している次の jwt デコード ヘルパー メソッドを作成したので、ヘッダーから kid を取得できます。

module.exports = {
  decodeJwt: function (token) {
    var segments = token.split('.');

    if (segments.length !== 3) {
      throw new Error('Not enough or too many segments');
    }

    // All segment should be base64
    var headerSeg = segments[0];
    var payloadSeg = segments[1];
    var signatureSeg = segments[2];

    // base64 decode and parse JSON
    var header = JSON.parse(base64urlDecode(headerSeg));
    var payload = JSON.parse(base64urlDecode(payloadSeg));

    return {
      header: header,
      payload: payload,
      signature: signatureSeg
    }

  }
}

function base64urlDecode(str) {
  return new Buffer(base64urlUnescape(str), 'base64').toString();
};

function base64urlUnescape(str) {
  str += Array(5 - str.length % 4).join('=');
  return str.replace(/\-/g, '+').replace(/_/g, '/');
}

このデコードを使用して、 https ://www.googleapis.com/oauth2/v1/certs から新しい公開証明書を取得する必要があるかどうかを判断しています。

次に、その公開証明書と node-jws ( https://github.com/brianloveswords/node-jws ) jws.verify(id_token, cert) を使用して署名を検証しています!

万歳!返信で追加の説明をありがとうございました。それは、私が何をしようとしているのかを理解するのに大いに役立ちました. これが他の人にも役立つことを願っています。

4

1 に答える 1