2017-03-31 16 views
3

私はADAL-JS(および大角)を使用するangularjs SPAウェブアプリを持っています。 これはMS Azureの企業ADとの認証を設定しています。ログインフローが正しく機能しているように見え、SPAはid_tokenを受信します。MS Azure ADによって生成されたJWT id_tokenを確認する方法は?

次に、ユーザーがボタンをクリックすると、SPAはAWS APIゲートウェイでホストしているREST APIにリクエストを行います。 id_tokenをAuthorization: Bearer <id_token>ヘッダーに渡しています。 APIゲートウェイは意図したとおりにヘッダーを受け取り、指定されたトークンが良好かどうかを判断してアクセスを許可または拒否する必要があります。

私はサンプルトークンを持っていて、それは正しくhttps://jwt.io/で解析されますが、これまで署名を検証するために使用する公開鍵または証明書を見つけることができませんでした。 Iはで見た:

私は私はJWTのid_tokenから子供とx5tの特性のマッチングhttps://login.microsoftonline.com/common/discovery/keysにキーのx5cプロパティの値を使用すべきだと思う(で始まるx5c値につながり、現在a3QN0BZS7s4nN-BdrjbF0Y_LdMM、「MIIDBTCCAe2gAwIBAgIQYを...」) 。しかし、https://jwt.io/ページには「Invalid Signature」と表示されます(「----- BEGIN CERTIFICATE -----」と「----- END CERTIFICATE -----」)。

また、上記の場合と同様にid_tokenの検証を容易にする(おそらくPythonの)ライブラリがあります(私は自分自身で署名鍵を取得する必要はありません)。私が見つけた最高の(ADAL for python)はこの機能を提供していないようですか?私がこれまでにまとめることができ

+0

[this](https://github.com/Azure/msrestazure-for-python/blob/master/msrestazure/azure_active_directory.py#L166) – 4c74356b41

+0

ちょっと@ 4c74356b41 - ありがとうございました!便利かもしれませんが、私はそのlibでトークンの署名がチェックされているのを見ませんか? – FOR

答えて

7

最適なソリューション:

グラブid_tokenからkidx5tに一致するhttps://login.microsoftonline.com/common/discovery/keyshttps://login.microsoftonline.com/common/discovery/v2.0/keys、のいずれかから証明書x5cプロパティ配列の最初の値)。

ラップ-----BEGIN CERTIFICATE-----\n\n-----END CERTIFICATE-----内の証明書(改行は関係するように見える)、および(https://jwt.io/に、id_tokenと一緒に)公開鍵として結果を使用します。

実際のユースケースでは、着信JWT id_tokensを検証するプログラムがある可能性が高いため、Web UIから確認するためのトークンを単に取得するのではなく、https://jwt.io/です。例えば

、パイソンでは、私はこのような何かが必要です。the JWT Siteを参照して、さまざまな言語でJWTライブラリのリストについては

#!/usr/bin/env python 

import jwt 
from cryptography.x509 import load_pem_x509_certificate 
from cryptography.hazmat.backends import default_backend 

PEMSTART = "-----BEGIN CERTIFICATE-----\n" 
PEMEND = "\n-----END CERTIFICATE-----\n" 

mspubkey = "The value from the x5c property" 
IDTOKEN = "the id_token to be validated" 
tenant_id = "your tenant id" 

cert_str = PEMSTART + mspubkey + PEMEND 
cert_obj = load_pem_x509_certificate(cert_str, default_backend()) 
public_key = cert_obj.public_key() 

decoded = jwt.decode(IDTOKEN, public_key, algorithms=['RS256'], audience=tenant_id) 
if decoded: 
    print "Decoded!" 
else: 
    print "Could not decode token." 

を。 私はpyjwtとそのcryptography依存関係を使用しています(これはバイナリ依存関係があるため、ターゲットOS用にビルドしてパッケージ化する必要があります)。

そして、もちろん、は、のような追加の詳細をrecommended hereとして確認することができます。

+1

これまでPythonをコード化していません。私が理解しているところによると、これをAzure ADが使用する署名鍵として頻繁に使用することはできません。今年からMicrosoftは、プログラム/アプリケーションがシームレスに処理することを期待しています。以下を参照してくださいhttps://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-signing-key-rollover –

+0

@Gopi Kollaあなたは間違い無しです。実際には、この初期コード(トークン検証の仕組みを理解することを目的としていました)を超えて、私はすでにMS公開鍵を取得しています(24時間ごとにチェックするように、毎日のスケジュールで)私はそれらをオンデマンドで使用することができます。 しかし、一つは、私は見つめて(そしてゆっくりとで離れてチッピング)してきたすべての作業を行うことになっていない場合、私は...興味を持って...どのように1は、authおよび.NETアプリケーションではないとMSのAzure ADを使用することができます(Azureで走っていますか?) – FOR

+0

答えを受け入れる..それは実際に働いた! – FOR

0

JVMソリューションでは、com.nimbusds:numbus-jose-jwt:4.29を使用すると、署名されたRSA256 id_tokenを解析して検証する最も単純な方法です。次Scalaのコードは、JSONのWebキーでJWTトークンを解析します

val jwt = SignedJWT.parse(token) 

    val n = new Base64URL("Your Modulus Component of RSA Key") 
    val e = new Base64URL("AQAB") 
    val rsaKey = new RSAKey.Builder(n, e).keyUse(KeyUse.SIGNATURE).algorithm(JWSAlgorithm.RS256).build() 

    val verified = jwt.verify(new RSASSAVerifier(rsaKey)) 

アプリケーションまだ動的に潜在的にAADで使用されるキーのセットを取得するためのAzure Active DirectoryのB2C discovery/v2.0/keyからJSONのWebキーセットをフェッチする必要がありますB2C。これはおそらくキャッシュされ、効率のために24時間以下のTTLを持つべきです。

関連する問題