HTTP トリガーに JSON Web トークン (JWT) 認証を設定することで、有効な JWT を持つクライアントのみがご利用の関数にアクセスできるようにします。このアプローチにより、不正アクセスや悪意のある攻撃からご利用の HTTP サービスを保護します。
背景情報
概要
Function Compute は、HTTP トリガーの JWT 認証をサポートしています。JWT (JSON Web トークン、RFC7519) は、トークンベースの便利な認証方式です。ユーザーの状態情報は、クライアントから提供される Token に保存されます。関数 (サーバー) はこの情報を保存する必要がないため、サーバーレスに適した認証方法です。Function Compute は、HTTP トリガーにバインドした公開 JWKS を使用して、HTTP リクエスト内の JWT を認証できます。HTTP トリガーの設定に基づき、claims をパラメーターとして関数に転送できます。これにより、関数は認証を実行する代わりに、ビジネスロジックに集中できます。JWT Token 認証プロセスと基本概念の詳細については、「JWT ベースのトークン認証」および「JWT の概要」をご参照ください。
JWT 認証フロー
上の図は、非対称暗号化アルゴリズムを使用する HTTP トリガーの JWT 認証プロセスを示しています。
クライアントは、カスタム認証サービスに認証リクエストを送信します。リクエストには通常、エンドユーザーのユーザー名とパスワードが含まれます。
カスタム認証サービスは、リクエスト内の認証情報 (ユーザー名やパスワードなど) を検証します。検証が成功すると、秘密鍵を使用して標準トークンを生成します。
カスタム認証サービスは、応答でトークンをクライアントに返します。クライアントは、この
tokenをローカルにキャッシュします。クライアントは、トークンを含むビジネスリクエストを HTTP トリガーに送信します。
HTTP トリガーは、設定された公開鍵を使用してリクエスト内のトークンを検証します。
検証が成功すると、トリガーはリクエストを保護された関数に渡します。
保護された関数は、ビジネスリクエストを処理し、応答を返します。
HTTP トリガーは、ビジネス応答をクライアントに返します。
前提条件
関数と HTTP トリガーが作成されていること。詳細については、「関数の作成」および「トリガーの作成」をご参照ください。
制限事項
JWT は任意の方法で生成および配布できます。Function Compute は、トリガーに設定された公開 JWKS を使用して JWT を認証します。
Function Compute は、キー ID (
kid) のない JWK をサポートしています。トリガーは、
header、Queryパラメーター (GET)、フォームパラメーター (POST)、またはcookieからトークンを読み取ることができます。claimsをheader、フォームパラメーター (POST)、またはcookieとして関数に転送できます。Function Compute では、HTTP トリガーに JWKS を設定できます。システムは JWKS を検索し、
token内のkidと一致するキー ID (kid) を持つ公開 JWK を探します。その後、トリガーはこのキーを使用してトークンの署名を検証します。トリガーの JWKS には、kidがない、または `kid` が空文字列である JWK を最大 1 つ含めることができます。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 署名アルゴリズムは対称暗号化を使用しており、セキュリティが低いです。より安全な非対称暗号化アルゴリズムの使用を推奨します。
非対称暗号化アルゴリズムを使用する場合、セキュリティのため、JWKS には公開鍵情報のみが含まれていることを確認してください。秘密鍵の詳細は含めないでください。
tokenなどのリクエスト内の機密情報を保護するために、HTTPS の使用を推奨します。
操作手順
ステップ 1: JWT 認証の設定
Function Compute コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
上部のナビゲーションバーで、リージョンを選択します。[関数] ページで、対象の関数をクリックします。
関数の詳細ページで、トリガー タブをクリックします。HTTP トリガーを見つけ、変更 列の [変更] をクリックします。
[トリガーの変更] パネルで、次のパラメーターを設定し、OK をクリックします。
認証方法 で、JWT 認証 を選択します。
[JWKS] を設定します。
HTTP トリガーの JWT 認証を設定するには、有効な JWKS を提供する必要があります。独自の JWKS を生成するか、JSON Web Key Generator を検索してオンラインツールを使用できます。たとえば、mkjwk.org を使用できます。PEM 形式のキーがある場合は、jwx などのツールを使用して JWKS 形式に変換できます。
このトピックでは、mkjwk.org を使用して JWKS を生成する方法を説明します。次の図に示すように、キー生成ページで、[キーの使用法] を [署名] に、[アルゴリズム] を [RS256] に、[X.509 を表示] を [はい] に設定し、[生成] をクリックします。コード内で秘密鍵 (図の ①) を使用して JWT トークンを発行し、安全に保管します。公開鍵 (図の ②) をコピーし、コンソールの JWKS 設定の keys 配列に貼り付けます。


次の例は、JWKS 設定を示しています。
{ "keys": [ { "alg": "RS256", "e": "AQAB", "kty": "RSA", "n": "u1LWgoomekdOMfB1lEe96OHehd4XRNCbZRm96RqwOYTTc28Sc_U5wKV2umDzolfoI682ct2BNnRRahYgZPhbOCzHYM6i8sRXjz9Ghx3QHw9zrYACtArwQxrTFiejbfzDPGdPrMQg7T8wjtLtkSyDmCzeXpbIdwmxuLyt_ahLfHelr94kEksMDa42V4Fi5bMW4cCLjlEKzBEHGmFdT8UbLPCvpgsM84JK63e5ifdeI9NdadbC8ZMiR--dFCujT7AgRRyMzxgdn2l-nZJ2ZaYzbLUtAW5_U2kfRVkDNa8d1g__2V5zjU6nfLJ1S2MoXMgRgDPeHpEehZVu2kNaSFvDUQ", "use": "sig" } ] }[JWT トークン設定] セクションで、
tokenの場所を選択し、tokenの名前を指定します。Tokenの場所は、ヘッダー、Cookie、クエリパラメーター (GET)、およびフォームパラメーター (POST) をサポートしています。Tokenの場所としてヘッダーを選択した場合は、[パラメーター名] と [プレフィックスの削除] も指定する必要があります。Function Compute がトークンを取得すると、[プレフィックスの削除] で指定されたプレフィックスを削除します。
[JWT Claim の変換] セクションで、claim の送信先、元の claim 名、および関数に渡される新しいパラメーター名を指定します。
マッピングパラメーターの場所は、ヘッダー、Cookie、またはフォームパラメーター (POST) にすることができます。

リクエストのマッチングモードを設定します。
[すべて一致]:すべての HTTP リクエストで JWT 検証が必要です。
[ホワイトリストモード]:[リクエストパスのホワイトリスト] 内のパスへのリクエストは JWT 検証をバイパスします。他のすべてのリクエストでは検証が必要です。
[ブラックリストモード]:[リクエストパスのブラックリスト] 内のパスへのリクエストのみ JWT 検証が必要です。他のすべてのリクエストは検証をバイパスします。
[ホワイトリストモード] と [ブラックリストモード] は、次の 2 つのマッチングモードをサポートしています。
完全一致
リクエストパスは、指定されたパスと完全に一致する必要があります。たとえば、[リクエストパスのブラックリスト] を /a に設定した場合、パス /a へのリクエストは JWT 検証が必要ですが、パス /a/ へのリクエストは不要です。
あいまい一致
パスの末尾にワイルドカード (*) を使用できます。たとえば、[リクエストパスのブラックリスト] を /login/* に設定した場合、/login/ で始まるすべてのパス (/login/a や /login/b/c/d など) へのリクエストは JWT 検証が必要です。
ステップ 2: 設定の確認
Postman などのテストツールを使用して、HTTP サービスにアクセスできることを確認します。HTTP トリガーの JWT 設定に基づいて、アクセスアドレス、トークン、その他の情報を設定します。
「ステップ 1: JWT 認証の設定」で生成した X.509 PEM 形式の秘密鍵を使用して、JWT トークンを発行します。次の手順では、Python を例に、ローカルスクリプトを使用してトークンを生成する方法を説明します。
PyJWT モジュールをインストールします。
pip install 'PyJWT>=2.0'次の Python スクリプトをローカルで実行して、JWT トークンを生成します。
import jwt import time private_key = """ -----BEGIN PRIVATE KEY----- <ステップ 1 で生成した 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(), headers=headers) print("Generated token: %s" % encoded)
Postman を使用して、HTTP サービスへのアクセスを確認します。
関数詳細ページの トリガー タブで、HTTP トリガーのパブリックアクセスアドレスを取得し、Postman の URL フィールドに貼り付けます。
Postman の [Headers] タブで、トークンパラメーターを設定し、[Send] をクリックします。次の例は、トークン設定を示しています。
パラメーター
値
説明
Key
Authentication[JWT トークン設定] で設定したパラメーター名。
Value
Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiSm9uIFNub3ciLCJhZG1pbiI6dHJ1ZSwiZXhwIjo0ODI5NTk3NjQxfQ.eRcobbpjAd3OSMxcWbmbicOTLjO2vuLR9F2QZMK4rz1JqfSRHgwQVqNxcfOIO9ckDMNlF_3jtdfCfvXfka-phJZpHmnaQJxmnOA8zA3R4wF4GUQdz5zkt74cK9jLAXpokwrviz2ROehwxTCwa0naRd_N9eFhvTRnP3u7L0xn3ll4iOf8Q4jS0mVLpjyTa5WiBkN5xi9hkFxd__p98Pah_Yf0hVQ2ldGSyTtAMmdM1Bvzad-kdZ_wW0jcctIla9bLnOo-Enr14EsGvziMh_QTZ3HQtJuToSKZ11xkNgaz7an5de6PuF5ISXQzxigpFVIkG765aEDVtEnFkMO0xyPGLg[JWT トークン設定] で指定されたプレフィックスと、それに続く JWT トークン。この例の値は、プレフィックスが
Bearerに設定されていることを前提としています。重要リクエストヘッダーのトークン値は、[JWT トークン設定] セクションの [プレフィックスの削除] で設定したプレフィックスとスペースで正確に始まっている必要があります。そうでない場合、トリガーはトークンを解析できず、`invalid or expired jwt` エラーを返します。