web-dev-qa-db-ja.com

MS AzureADによって生成されたJWTid_tokenを確認する方法は?

ADAL-JS (およびadal-angular)を使用するangularjs SPAWebアプリがあります。これは、MSAzureの企業ADに対して認証するように設定されています。ログインフローは正しく機能しているようで、SPAはid_tokenを受け取ります。

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

サンプルトークンがあり、 https://jwt.io/ で正しく解析されますが、これまでのところ、署名の検証に使用する公開鍵または証明書を見つけることができませんでした。私は調べました:

Ithinkhttps://login.microsoftonline.com/common/discovery)のキーのx5cプロパティの値を使用する必要があります/ keys JWT id_tokenのkidプロパティとx5tプロパティを一致させます(現在はa3QN0BZS7s4nN-BdrjbF0Y_LdMMで、「MIIDBTCCAe2gAwIBAgIQY ...」で始まるx5c値になります)。ただし、 https://jwt.io/ ページで「無効な署名」が報告されます(キー値を「----- BEGINCERTIFICATE -----」と「-」でラップしてみました---- END CERTIFICATE ----- ")。

また、上記の場合のように、特定のid_tokenの検証を容易にすることができる(おそらくPythonの)ライブラリはありますか(自分で署名キーを取得する必要がないように)...最高の私( ADAL for python )がこの機能を提供していないようです。

11
FOR

これまでにまとめることができた最善の解決策:

証明書を取得x5cプロパティ配列の最初の値)https://login.microsoftonline.com/common/discovery/keysまたはhttps://login.microsoftonline.com/common/discovery/v2.0/keysのいずれかから、id_tokenのkidおよびx5tと一致します。

証明書をラップする-----BEGIN CERTIFICATE-----\n\n-----END CERTIFICATE-----で(改行が重要なようです)、結果を公開鍵として使用します(id_tokenと組み合わせて https://jwt.io/ )。

もちろん、実際のユースケースでは、プログラムが着信JWT id_tokensを検証する可能性が高いため、目標は、トークンを取得して、 https://jwt.io /

たとえば、in pythonの場合、次のようなものが必要です。

#!/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."

さまざまな言語のJWTライブラリのリストについては、 JWTサイト を参照してください。 pyjwt とその cryptography 依存関係(バイナリ依存関係があるため、ターゲットOS用にビルドしてパッケージ化する必要があります)を使用しています。

そしてもちろん、クレームなどの追加の詳細を確認する as ここで推奨

17
FOR

JVMソリューションの場合、com.nimbusds:numbus-jose-jwt:4.29を使用することが、署名されたRSA256id_tokenを解析および検証するための最も簡単な方法です。次のScalaコードは、JSONWebキーを使用して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 B2Cで使用される可能性のあるキーのセットを取得するには、アプリケーションでAzure Active Directory B2C discovery/v2.0/keyからJSONWebキーセットを動的にフェッチする必要があります。これはおそらくキャッシュされ、効率のために24時間以内のTTL)である必要があります。

2
k.c. sham

また、上記の場合のように、特定のid_tokenの検証を容易にすることができる(おそらくPythonの)ライブラリはありますか(自分で署名キーを取得する必要がないように)...最高の私(PythonのADAL)がこの機能を提供していないようです。

価値があるのは、ADAL Pythonの後継である MSAL Python が内部でidトークンを検証し、 idトークン内でデコードされたクレームを提供する アプリの場合です。そのため、MSAL Python)を介してそのIDトークンを取得したばかりのアプリは、ローカルでそれを消費できます。

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

通常、IDトークンは、承認の目的でサードパーティに送信するために「Authorization: Bearer <id_token>ヘッダーで」使用されません。 YMMV。

0
RayLuo