Function Compute では、HTTP トリガーに対して JSON Web トークン (JWT) 認証を設定できます。この設定により、有効な JWT を持つクライアントのみが関数にアクセスできるようになり、HTTP サービスのセキュリティが強化され、不正アクセスや悪意のある攻撃を防ぐことができます。
背景情報
概要
Function Compute では、HTTP トリガーに対して JWT 認証を有効にできます。JWT は RFC 7519 で定義されており、リクエストを認証するためのトークンベースのメソッドです。ユーザーの状態情報はクライアントから提供される token に保存されるため、関数 (サーバー) 側でこの情報を保存する必要がありません。これにより、サーバーレスに適した認証方式となります。Function Compute は、HTTP トリガーに設定した公開 JSON Web Key Set (JWKS) を使用して、HTTP リクエストに対して JWT 認証を実行します。トリガーの設定に基づき、Function Compute は claims (クレーム) をパラメーターとして関数に渡すことができます。これにより、関数はリクエストの認証ではなく、ビジネスロジックに集中できます。JWT token 認証のプロセスと基本については、「JWT ベースのトークン認証」および「JWT の概要」をご参照ください。
JWT 認証の仕組み
上の図は、非対称暗号化アルゴリズムを使用する Function Compute の HTTP トリガーにおける JWT 認証ワークフローのシーケンスを示しています。手順は以下の通りです。
-
クライアントは、カスタム権限付与サービスに認証リクエストを送信します。このリクエストには通常、エンドユーザーのユーザー名とパスワードが含まれます。
-
カスタム権限付与サービスは、リクエスト内の認証情報 (ユーザー名やパスワードなど) を検証します。検証が成功すると、秘密鍵を使用して標準トークンを生成します。
-
カスタム権限付与サービスは、トークンを含む応答をクライアントに返します。クライアントは、この
tokenをローカルにキャッシュする必要があります。 -
クライアントは、トークンを含むビジネスリクエストを HTTP トリガーに送信します。
-
HTTP トリガーは、設定された公開鍵を使用してリクエスト内のトークンを検証します。
-
トークンが検証されると、トリガーはリクエストを保護対象の関数に渡します。
-
保護対象の関数はビジネスリクエストを処理し、応答を返します。
-
HTTP トリガーは、ビジネス応答をクライアントに転送します。
前提条件
制限事項
-
任意の方法で JWT を生成および配布できます。Function Compute は、トリガーに設定された公開 JWKS を使用して JWT を認証します。
-
Function Compute は、
kid(キー ID) を持たない JSON Web Key (JWK) をサポートしています。 -
トリガーは、リクエストの
header(ヘッダー)、Query(クエリ) パラメーター (GET リクエストの場合)、フォームパラメーター (POST リクエストの場合)、またはcookieからトークンを読み取ることができます。 -
claims(クレーム) をheader(ヘッダー)、フォームパラメーター (POST リクエストの場合)、またはcookieとして関数に転送できます。 -
Function Compute では、HTTP トリガーに JWKS を設定できます。システムは JWKS 内で、
token内のkidと一致する公開 JWK を検索します。その後、この公開鍵を使用してtokenの署名を検証します。トリガーの JWKS には、kidが欠落しているか空文字列である JWK を最大 1 つまで含めることができます。Function Compute の 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 には公開鍵情報のみを含めるべきです。秘密鍵情報を含めないことを推奨します。
-
トークンの漏洩を防ぐため、リクエスト内の
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 クレーム変換 セクションで、パラメーターの転送先、元のパラメーター名、および関数の新しいパラメーター名を指定します。
クレームをヘッダー、Cookie、またはフォームパラメーター (POST) にマッピングできます。

-
リクエストのマッチングモードを設定します。
-
すべて一致:すべての HTTP リクエストに JWT 認証が必要です。
-
ホワイトリストモード:リクエストパスのホワイトリスト で指定されたパスへの HTTP リクエストには JWT 認証は不要です。他のすべてのリクエストには JWT 認証が必要です。
-
ブラックリストモード:リクエストパスのブラックリスト で指定されたパスへの HTTP リクエストには JWT 認証が必要です。他のすべてのリクエストには JWT 認証は不要です。
ホワイトリストモード と ブラックリストモード は、以下の 2 つのマッチングタイプをサポートしています。
-
完全一致
リクエストパスは、設定されたパスと完全に一致する場合にのみマッチします。たとえば、リクエストパスのブラックリスト を /a に設定した場合、/a へのリクエストには JWT 認証が必要ですが、/a/ へのリクエストには不要です。
-
あいまい一致
パスにワイルドカード (*) を使用できますが、ワイルドカード (*) はパスの末尾に配置する必要があります。たとえば、リクエストパスのブラックリスト を /login/* に設定した場合、/login/ をプレフィックスとするすべてのパス (例: /login/a や /login/b/c/d) へのリクエストには JWT 認証が必要です。
-
-
ステップ 2: 設定の確認
Postman などのテストツールを使用して、エンドポイント、トークン、その他の情報を提供し、HTTP トリガーの JWT 設定に基づいて HTTP サービスに期待どおりにアクセスできることを確認します。
-
ステップ 1 で生成した 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": "田中太郎", "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 で、ヘッダーにトークンパラメーターを設定し、[送信] をクリックします。以下の表に、トークン設定の例を示します。
パラメーター
値
説明
キー
AuthenticationJWT トークンの設定 セクションで指定したパラメーター名。
値
Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiSm9uIFNub3ciLCJhZG1pbiI6dHJ1ZSwiZXhwIjo0ODI5NTk3NjQxfQ.eRcobbpjAd3OSMxcWbmbicOTLjO2vuLR9F2QZMK4rz1JqfSRHgwQVqNxcfOIO9ckDMNlF_3jtdfCfvXfka-phJZpHmnaQJxmnOA8zA3R4wF4GUQdz5zkt74cK9jLAXpokwrviz2ROehwxTCwa0naRd_N9eFhvTRnP3u7L0xn3ll4iOf8Q4jS0mVLpjyTa5WiBkN5xi9hkFxd__p98Pah_Yf0hVQ2ldGSyTtAMmdM1Bvzad-kdZ_wW0jcctIla9bLnOo-Enr14EsGvziMh_QTZ3HQtJuToSKZ11xkNgaz7an5de6PuF5ISXQzxigpFVIkG765aEDVtEnFkMO0xyPGLgJWT トークンの設定 セクションで指定した [プレフィックスの削除] パラメーターの値と JWT トークンを連結したもの。この例の値は、[プレフィックスの削除] が
Bearerに設定されていることを前提としています。重要リクエストヘッダー内の JWT パラメーターのプレフィックスとスペースは、JWT トークンの設定 セクションで指定した プレフィックスの削除 の値と完全に一致する必要があります。一致しない場合、トリガーはトークンを解析できず、
invalid or expired jwtエラーを返します。
-