JSON Web Token (JWT) は、リクエストを認証するための使いやすいトークンベースの方法です。 JWT認証は、クライアントによって提供されるトークンを使用して、ユーザステータス情報を格納する。 関数はユーザーステータス情報を格納する必要はありません。 これにより、JWT認証はサーバーレスアプリケーションにとって理想的な方法になります。 Function Computeは、カスタムドメイン名にバインドされているパブリックJSON Webキーセット (JWKS) を使用して、カスタムドメイン名に送信されるリクエストのJWT認証を実装します。 Function Computeは、カスタムドメイン名の設定に基づいて関数にクレームを転送します。 このように、関数ではリクエスト認証は必要なく、ビジネスロジックのみに集中できます。
背景情報
概要
JWTは、リクエストを認証するための使いやすいトークンベースの方法です。 詳細については、「RFC 7519」をご参照ください。 JWT認証は、クライアントによって提供されるトークン
を使用してユーザーステータス情報を格納します。 関数はユーザーステータス情報を格納する必要はありません。 これにより、JWT認証はサーバーレスアプリケーションにとって理想的な方法になります。 Function Computeは、カスタムドメイン名にバインドされているパブリックJWKSを使用して、カスタムドメイン名に送信されるリクエストに対してJWT認証を実装します。 Function Computeは、カスタムドメイン名の設定に基づいて関数にクレームを転送します。 このように、関数ではリクエスト認証は必要なく、ビジネスロジックのみに集中できます。 認証プロセスとJWTトークン
の基本については、「JWTベースの認証」および「JSON Webトークンの概要」をご参照ください。
JWT认证プロセス
カスタムドメイン名のJWT認証プロセスは、HTTPトリガーのJWT認証プロセスと同じです。
上の図は、Function ComputeのHTTPトリガーのJWT認証プロセスを示しています。 このプロセスでは、非対称暗号化アルゴリズムが使用される。 次の項目は、プロセスの詳細を説明します。
クライアントは、認証要求をカスタム承認者に送信します。 ほとんどの場合、ユーザーのユーザー名とパスワードはリクエストで指定されています。
カスタム承認者は、リクエスト内のユーザー名やパスワードなどの認証情報を読み取り、検証します。 リクエストが検証に合格した後、承認者は秘密鍵を使用して標準の
トークン
を生成します。カスタム承認者は、
トークン
を含む応答をクライアントに転送します。 クライアントは、トークン
をオンプレミスのマシンにキャッシュします。クライアントは、
トークン
を含むビジネスリクエストをHTTPトリガーに送信します。HTTPトリガーは、設定された公開キーを使用して、リクエスト内の
トークン
を検証します。検証に合格した後、リクエストは保護された関数に渡されます。
protected関数は、要求を処理して応答します。
HTTPトリガーは、ビジネス応答をクライアントに転送します。
制限事項
ビジネス要件に基づいてJWTを生成および配布できます。 Function Computeは、トリガー用に設定されたパブリックJWKSを使用してJWTを認証します。
キーID (
kid
) を含まないJSON Webキー (JWK) がサポートされています。トリガーに複数のJWKを設定できます。
ヘッダー
、クエリ
、フォーム、およびcookie
パラメーターからトークンを読み取ることができます。クレーム
は、ヘッダー
、クエリ
、フォーム、およびcookie
パラメーターとして関数に転送できます。Function Computeでは、カスタムドメイン名のJWKSを設定できます。 カスタムドメイン名にJWKSを設定すると、Function Computeはトークンと同じキーIDを持つJWK公開キーを検索し、その公開キーを使用してトークンの署名検証を実行します。 最大1つのJWKのキーIDを指定しないか、カスタムドメイン名のJWKSで空の文字列に設定できます。
次の表に、Function ComputeのJWTでサポートされている署名アルゴリズムを示します。
署名アルゴリズム
alg値
RSASSA-PKCS1-V1_5
RS256、RS384、またはRS512
RSASSA-PSS
PS256、PS384、またはPS512
楕円カーブ (ECDSA)
ES256、ES384、またはES512
HMAC
HS256、HS384、またはHS512
EdDSA
EdDSA
ハッシュベースのメッセージ認証コード (HMAC) 署名アルゴリズムは、対称暗号化を使用する。 非対称暗号化と比較して、対称暗号化は安全性が低い。 セキュリティを向上させるために、非対称暗号化アルゴリズムを使用することを推奨します。
非対称暗号化アルゴリズムを使用する場合は、セキュリティ上の理由から、公開鍵に関する情報のみをJWTに含める必要があります。
リクエスト内の
トークン
などの機密情報を保護するためにHTTPSを使用することを推奨します。 これは、トークン漏れを防ぐのに役立ちます。
JWT認証の設定
前提条件
カスタムドメイン名が作成されます。 詳細については、「」をご参照ください。
手順
Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、 を選択します。
上部のナビゲーションバーで、管理するカスタムドメイン名が存在するリージョンを選択します。 [カスタムドメイン] ページで、管理するカスタムドメイン名をクリックします。
表示されるページの右上隅にある [変更] をクリックします。 [カスタムドメイン名の変更] ページで、次の項目を設定し、[保存] をクリックします。
[認証方法] を [JWT認証] に設定します。
JWKSを設定します。
カスタムドメイン名のJWT認証を設定するには、有効なJWKSが必要です。 自分でJWKSを生成できます。 JSON Web Key Generatorでmkjwk.orgなどのオンラインジェネレーターを検索して、JWKSを生成することもできます。 PEM形式の秘密鍵がある場合は、jwxなどのツールを使用して、鍵の形式をJWKS形式に変換できます。
次の例では、mkjwk.orgを使用してJWKSを生成します。 [キーの使用] 、[アルゴリズム] 、および [X.509の表示] パラメーターを設定し、[生成] をクリックします。 プライベートキー (次の図の ①) を使用して、コード内でJWTトークンを発行する必要があります。 秘密鍵を秘密にしてください。 公開鍵 (下図の ②) をコピーして、Function ComputeコンソールのJWKSのkeys配列に入力できます。
次のサンプルコードは、設定されたJWKSを示しています。
{ "keys": [ { "alg": "RS256", "e": "AQAB", "kty": "RSA", "n": "u1LWgoomekdOMfB1lEe96OHehd4XRNCbZRm96RqwOYTTc28Sc_U5wKV2umDzolfoI682ct2BNnRRahYgZPhbOCzHYM6i8sRXjz9Ghx3QHw9zrYACtArwQxrTFiejbfzDPGdPrMQg7T8wjtLtkSyDmCzeXpbIdwmxuLyt_ahLfHelr94kEksMDa42V4Fi5bMW4cCLjlEKzBEHGmFdT8UbLPCvpgsM84JK63e5ifdeI9NdadbC8ZMiR--dFCujT7AgRRyMzxgdn2l-nZJ2ZaYzbLUtAW5_U2kfRVkDNa8d1g__2V5zjU6nfLJ1S2MoXMgRgDPeHpEehZVu2kNaSFvDUQ", "use": "sig" } ] }
JWTトークンを設定します。
読み取り位置とトークンの名前を選択します。 読み取り位置パラメーターをヘッダー、Cookie、クエリパラメーター、またはフォームパラメーターに設定できます。 [読み取り位置] パラメーターを [ヘッダー] に設定した場合、ヘッダーにプレフィックスを指定する必要があります。 Function Computeがトークンを取得すると、プレフィックスが削除されます。
JWTクレーム変換を設定します。
[JWTクレーム変換] セクションで、パラメーターを関数に渡す位置、パラメーターの元の名前、およびパラメーターが関数に渡された後の新しい名前を選択します。 マッピングパラメーターの位置をヘッダー、Cookie、クエリパラメーター、またはフォームパラメーターに設定できます。
Verify the result
カスタムドメイン名のJWT設定に基づいて、テストツールにカスタムドメイン名とトークンを入力し、ドメイン名を使用して関数にアクセスできるかどうかを確認します。 このトピックでは、Postmanが使用されます。
[Configure JWT authentication] で生成された秘密鍵を使用して、JWTトークンを作成します。
Postmanを使用して、カスタムドメイン名を使用して関数にアクセスできるかどうかを確認します。
Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、 を選択します。 [カスタムドメイン] ページで、管理するカスタムドメイン名を見つけます。
Postmanのヘッダーでトークンのパラメーターを設定します。 例:
パラメーター
値
説明
Key
認証
[JWTトークン設定] セクションで設定したパラメーターの名前。
値
ベアラーeyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiSm9uIFNub3ciLCJhZG1pbiI6dHJ1ZSwiZXhwIjo0ODI5NTk3NjQxfQ.eRcobbpjAd3OSMxcWbmbicOTLjO2vuLR9F2QZMK4rz1JqfSRHgwQVqNxcfOIO9ckDMNlF_3jtdfCfvXfka-phJZpHmnaQJxmnOA8zA3R4wF4GUQdz5zkt74cK9jLAXpokwrviz2ROehwxTCwa0naRd_N9eFhvTRnP3u7L0xn3ll4iOf8Q4jS0mVLpjyTa5WiBkN5xi9hkFxd__p98Pah_Yf0hVQ2ldGSyTtAMmdM1Bvzad-kdZ_wW0jcctIla9bLnOo-Enr14EsGvziMh_QTZ3HQtJuToSKZ11xkNgaz7an5de6PuF5ISXQzxigpFVIkG765aEDVtEnFkMO0xyPGLg
[JWTトークン設定] セクションの [プレフィックスの削除] パラメーターに指定したベアラトークンと、前の手順で生成されたJWTトークン。 ベアラートークンとJWTトークンの間にスペースを残します。
[送信] をクリックして、返された情報を表示します。
nametofunction
は、クレームが関数に渡された後のパラメーターの名前です。