JSON Web トークン (JWT) は、リクエストを認証するための使いやすいトークンベースのメソッドです。JWT 認証では、クライアントから提供されるトークンを使用してユーザーの状態情報を保存します。関数側でユーザーの状態情報を保存する必要がないため、JWT 認証はサーバーレスアプリケーションに最適なメソッドです。Function Compute は、カスタムドメイン名にバインドされた公開 JSON Web Key Set (JWKS) を使用して、そのカスタムドメイン名に送信されるリクエストに対して JWT 認証を実装します。また、FC はカスタムドメイン名の構成に基づいてクレームを関数に転送します。これにより、関数内でリクエスト認証が不要になり、ビジネスロジックに集中できます。
背景情報
概要
JWT は、リクエストを認証するための使いやすいトークンベースのメソッドです。詳細については、RFC 7519 をご参照ください。JWT 認証では、クライアントから提供される tokens を使用してユーザーの状態情報を保存します。関数側でユーザーの状態情報を保存する必要がないため、JWT 認証はサーバーレスアプリケーションに最適なメソッドです。Function Compute は、カスタムドメイン名にバインドされた公開 JWKS を使用して、そのカスタムドメイン名に送信されるリクエストに対して JWT 認証を実装します。また、FC はカスタムドメイン名の構成に基づいてクレームを関数に転送します。これにより、関数内でリクエスト認証が不要になり、ビジネスロジックに集中できます。JWT tokens の認証プロセスと基本については、「JWT ベースのトークン認証」および「JSON Web トークンの概要」をご参照ください。
JWT 認証プロセス
カスタムドメイン名の JWT 認証プロセスは、HTTP トリガーの JWT 認証プロセスと同じです。
上の図は、Function Compute における HTTP トリガーの JWT 認証プロセスを示しています。このプロセスでは、非対称暗号化アルゴリズムが使用されます。プロセスの詳細は次のとおりです:
クライアントはカスタムオーソライザーに認証リクエストを送信します。ほとんどの場合、リクエストにはユーザーのユーザー名とパスワードが指定されます。
カスタムオーソライザーは、リクエスト内のユーザー名やパスワードなどの認証情報を読み取って検証します。リクエストが検証に合格すると、オーソライザーは秘密鍵を使用して標準の
tokenを生成します。カスタムオーソライザーは、
tokenを含む応答をクライアントに転送します。クライアントはtokenをローカルマシンにキャッシュします。クライアントは、
tokenを含むビジネスリクエストを HTTP トリガーに送信します。HTTP トリガーは、設定された公開鍵を使用してリクエスト内の
tokenを検証します。検証に合格すると、リクエストは保護された関数に渡されます。
保護された関数はリクエストを処理し、応答します。
HTTP トリガーはビジネス応答をクライアントに転送します。
制限事項
ビジネス要件に基づいて JWT を生成および配布できます。Function Compute は、トリガーに設定された公開 JWKS を使用して JWT を認証します。
キー ID (
kid) を含まない JSON Web Keys (JWKs) がサポートされています。トリガーに対して複数の JWK を設定できます。
トークンは、
header、Query、フォーム、およびcookieパラメーターから読み取ることができます。クレームをヘッダー、クエリ、フォーム、およびクッキーパラメーターとして関数に転送できます。Function Compute では、カスタムドメイン名に JWKS を設定できます。カスタムドメイン名に JWKS を設定すると、FC はトークンと同じキー ID を持つ JWK 公開鍵を検索し、その公開鍵を使用してトークンの署名検証を実行します。カスタムドメイン名の JWKS では、最大 1 つの JWK のキー ID を未指定にするか、空の文字列に設定できます。
次の表に、FC の JWT でサポートされている署名アルゴリズムを示します。
署名アルゴリズム
alg の値
RSASSA-PKCS1-V1_5
RS256、RS384、または RS512
RSASSA-PSS
PS256、PS384、または PS512
Elliptic Curve (ECDSA)
ES256、ES384、または ES512
HMAC
HS256、HS384、または HS512
EdDSA
EdDSA
ハッシュベースのメッセージ認証コード (HMAC) 署名アルゴリズムは対称暗号化を使用します。非対称暗号化と比較して、対称暗号化はセキュリティが低くなります。セキュリティを向上させるために、非対称暗号化アルゴリズムを使用することを推奨します。
非対称暗号化アルゴリズムを使用する場合、セキュリティ上の理由から、JWT には公開鍵に関する情報のみを含める必要があります。
リクエスト内の
tokensなどの機密情報を保護するために、HTTPS を使用することを推奨します。これにより、トークンの漏洩を防ぐことができます。
JWT 認証の設定
前提条件
カスタムドメイン名が作成されていること。詳細については、「カスタムドメイン名の設定」をご参照ください。
操作手順
Function Compute コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
上部のナビゲーションバーで、管理するカスタムドメイン名が存在するリージョンを選択します。[カスタムドメイン] ページで、管理するカスタムドメイン名をクリックします。
表示されたページの右上隅にある [変更] をクリックします。[カスタムドメイン名の変更] ページで、次の項目を設定し、[保存] をクリックします。
[認証方法] を [JWT 認証] に設定します。

JWKS を設定します。
カスタムドメイン名に JWT 認証を設定するには、有効な JWKS が必要です。JWKS はご自身で生成することも、JSON Web Key Generator を検索して mkjwk.org などのオンラインジェネレーターを使用して生成することもできます。PEM 形式の秘密鍵をお持ちの場合は、jwx などのツールを使用して、キーの形式を JWKS 形式に変換できます。
次の例では、mkjwk.org を使用して JWKS を生成します。次の操作を実行します:[Key Use]、[Algorithm]、[Show X.509] パラメーターを設定し、[Generate] をクリックします。コード内で秘密鍵 (下図の ①) を使用して 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]、[クエリパラメーター]、または [フォームパラメーター] に設定できます。

結果の検証
カスタムドメイン名の JWT 設定に基づいて、テストツールにカスタムドメイン名とトークンを入力し、ドメイン名を使用して関数にアクセスできるかどうかを確認します。このトピックでは、Postman を使用します。
前のステップ (JWT 認証の設定) で生成した秘密鍵 (X.509 PEM フォーマット) を使用して、JWT トークンを作成します。
PyJWT モジュールをインストールします。詳細については、PyJWT をご参照ください。
次のサンプル Python スクリプトをローカルで実行して、JWT トークンを生成します。詳細については、PyJWT をご参照ください。
import time import jwt private_key = """ -----BEGIN PRIVATE KEY----- <JWT 認証の設定時に生成された X.509 PEM 形式の秘密鍵を使用します> -----END PRIVATE KEY----- """ headers = { "alg": "RS256", "typ": "JWT" } payload = { "sub": "1234567890", "name": "John Snow", "iat": int(time.time()), # トークン発行時刻 "exp": int(time.time()) + 60 * 60, # トークンの有効期間を 1 時間に設定 } encoded = jwt.encode(payload=payload, key=private_key.encode(), algorithm="RS256", headers=headers) print("Generated token: %s" % encoded)
Postman を使用して、カスタムドメイン名で関数にアクセスできるかどうかを確認します。
Function Compute コンソールにログインします。 左側のナビゲーションウィンドウで、を選択します。 [カスタムドメイン] ページで、管理するカスタムドメイン名を見つけます。 ドメイン名をコピーし、Postman の URL フィールドに貼り付けます。
Postman のヘッダーでトークンのパラメーターを設定します。例:
パラメーター
値
説明
キー
Authentication[JWT トークン設定] セクションで設定したパラメーターの名前です。
値
Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiSm9uIFNub3ciLCJhZG1pbiI6dHJ1ZSwiZXhwIjo0ODI5NTk3NjQxfQ.eRcobbpjAd3OSMxcWbmbicOTLjO2vuLR9F2QZMK4rz1JqfSRHgwQVqNxcfOIO9ckDMNlF_3jtdfCfvXfka-phJZpHmnaQJxmnOA8zA3R4wF4GUQdz5zkt74cK9jLAXpokwrviz2ROehwxTCwa0naRd_N9eFhvTRnP3u7L0xn3ll4iOf8Q4jS0mVLpjyTa5WiBkN5xi9hkFxd__p98Pah_Yf0hVQ2ldGSyTtAMmdM1Bvzad-kdZ_wW0jcctIla9bLnOo-Enr14EsGvziMh_QTZ3HQtJuToSKZ11xkNgaz7an5de6PuF5ISXQzxigpFVIkG765aEDVtEnFkMO0xyPGLg[JWT トークン設定] セクションで Remove Prefix パラメーターに指定したベアラートークン、および前のステップで生成された JWT トークン。
重要リクエストヘッダー内の JWT のフォーマットを、[JWT トークン設定] セクションの [プレフィックスの削除] 設定と一致させてください。一致しない場合、トリガーがトークンを解析しようとすると、「invalid or expired jwt」 というエラーメッセージが返されます。
[送信] をクリックすると、返された情報が表示されます。
nametofunctionは、クレームが関数に渡された後のパラメーターの名前です。