2013-11-23 16 views
32

Google OAuthを使用してノードエクスプレスアプリのユーザーを認証しようとしています。ノードアプリケーションでGoogle OAuth 2.0 JWT(OpenID Connect)をデコードするにはどうすればよいですか?

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

このすべてが理にかなって、私は私の人生のためにJWTをデコードする方法を見つけ出すことはできません:私は成功しそうのような応答を返すのOAuthを行うことができます。私はこれすべてのことで未経験なので、これは私にとっては少し外国語です。

ここに記載されている手順に従います。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)を呼び出します。トークンを正常に解読できました。証明書varが空のオブジェクトであっても{}。これはまだ3つの質問で私を残します。 1:GoogleからのURLを使用して私のエクスプレスアプリに証明書を取得する最善の方法は何ですか? 2:新しいバージョンを取り込む必要があるときは、どうすればわかりますか? 3:noVerify(jwt.decodeの3番目の引数)にtrueを渡すような感じがします。それを通過させることなく、それをどうやって稼働させることができますか? おそらくjwt-simpleはhs256を期待しており、トークンはrs256を使用しているようです。

また、私はこれで経験の浅すぎるので、私はここから離れているかもしれません。

* UPDATE * Natの助けを借りて、私はこの作業を行うことができました! 私はJWTとJWSノードモジュールを1つずつ試してみたと思います。私が最終的に着陸したのは以下の通りです: 私が見たモジュールのどれも、私が箱から欲しかったものはまったくありませんでした。私はid_tokenをデコードするために使用している以下のjwtデコードヘルパーメソッドを作成しました。ヘッダーから子を取得できます。

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

そのパブリック証明書とノード-JWS(https://github.com/brianloveswords/node-jws)jws.verify(id_token 、証明書)署名を検証する!

Hooray! ご返信いただいた追加の説明については、もう一度おねがいします。それは私が何をしようとしているのかを理解するのを助けてくれた長い道のりでした。これが他の人々にも役立つことを願っています。

答えて

48

仕様の観点から、あなたが遭遇しているのは[OpenID Connect]です。

id_tokenは[JWS]署名された[JWT]です。この場合、それは "。"です。 3つのコンポーネントで区切られた文字列。最初の部分はヘッダーです。 2番目はペイロードです。 3番目は署名です。それぞれBase64urlでエンコードされた文字列です。

あなたはヘッダをデコードするときのように、あなたが何かを得るだろう: "ALG" は、署名アルゴリズムいることを示し

{ "43ebb53b0397e7aaf3087d6844e37d55c5fb1b67" "ALG": "RS256"、 "子供は"} [JWA]で定義されているRS256です。 「子供」は、署名に使用された鍵に対応する公開鍵の鍵IDを示します。

2:

今、私はあなたの質問のいくつかに答える準備ができています、私はそれの新鮮なバージョンにプルする必要があるときにどのように私は知っているのだろうか?

キャッシュされたcertファイルの子供([JWK]ファイル)がヘッダー内の子供と一致しない場合は、新しい証明書ファイルを取得します。 (ところで、あなたは本命を引っ張り、そこからURLをx5uと呼ばれている。)

3:それは はひどいアイデアです(jwt.decodeで第三引数)NOVERIFYのための真に渡すように思えます。 を渡さずに、どうすればそれを動作させることができますか?

実際。おそらく、kjur.github.io/jsjws/のような別のライブラリを見たいかもしれません。

参照

  • openid.bitbucket.org/openid-connect-core-1_0.html [OpenIDの接続] [JWS] tools.ietf.org/html/draft-ietf-ホセ-JSONウェブ署名
  • [JWT]
  • [JWK] tools.ietf.org/html/draft-ietf tools.ietf.org/html/draft-ietf-oauth-json-web-token -autaut-json-web-keys
  • [JWA] tools.ietf.org/html/draft-ietf-j ose-json-web-algorithms
+0

すごい!徹底した詳細な説明に感謝します。これは、私が何をしようとしているのか、私の理解に大いに役立っています。そして、私はもう何か質問があれば、私が何を探しているべきかを知っています。ほんとうにありがとう。 – ThePuzzleMaster

関連する問題