JWT 認証を使用すると、Function Compute は、関数にリクエストが到達する前に、ゲートウェイレベルで受信リクエストを検証できます。カスタムドメイン名にパブリック JSON Web キーセット (JWKS) を設定すると、Function Compute はそれを使用してすべてのリクエストのトークンを検証し、検証済みのクレームを直接関数に転送します。関数はビジネスロジックのみを処理するため、認証コードは不要です。
JWT 認証をエンドツーエンドで設定するには、次の手順を実行します。
-
JWKS キーペアを生成し、プライベートキーを安全に保管します。
-
カスタムドメイン名で JWT 認証を有効にし、パブリックキーをコンソールに貼り付けます。
-
Function Compute が各リクエストからトークンを読み取る場所を設定します。
-
(オプション) JWT クレームを関数パラメーターにマッピングします。
-
テストトークンを生成し、Postman で設定を検証します。
仕組み
カスタムドメイン名の JWT 認証は、HTTP トリガーの JWT 認証と同じフローに従います。このプロセスでは非対称暗号化を使用します。プライベートキーがトークンに署名し、パブリックキーがそれを検証します。
フローは次のとおりです。
-
クライアントは、通常、ユーザー名とパスワードを使用して、カスタムオーソライザーに認証リクエストを送信します。
-
オーソライザーは認証情報を検証し、プライベートキーを使用して標準の JWT トークンを生成します。
-
オーソライザーはトークンをクライアントに返します。クライアントはそれをローカルにキャッシュします。
-
クライアントは、トークンを含むビジネスリクエストを HTTP トリガーに送信します。
-
Function Compute は、設定されたパブリックキーを使用してリクエスト内のトークンを検証します。
-
検証に成功すると、Function Compute はマッピングされたクレームを含むリクエストを関数に転送します。
-
関数はリクエストを処理し、レスポンスを返します。
-
Function Compute はレスポンスをクライアントに転送します。
JWT とトークン認証の背景については、「JWT-based token authentication」および「Introduction to JSON Web Tokens」をご参照ください。
制限
-
Function Compute は、ドメインに設定したパブリック JWKS を使用して JWT を認証します。JWT の生成と配布は、独自のビジネスロジックに基づいて行います。
-
キー ID (
kid) を持たない JSON Web Key (JWK) がサポートされています。JWKS 内の JWK のうち、kidが未指定または空にできるのは最大 1 つです。 -
カスタムドメイン名には、複数の JWK を設定できます。Function Compute は、トークンの
kidを正しい JWK と照合し、そのキーを使用して署名検証を行います。 -
トークンは
header、query、form、およびcookieパラメーターから読み取ることができます。 -
クレームは、
ヘッダー、クエリ、フォーム、およびCookieパラメーターとして転送できます。
サポートされている署名アルゴリズム:
| 署名アルゴリズム | 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 にパブリックキー情報のみを含めてください。HTTPS を使用して転送中のトークンを保護し、トークンの漏洩を防いでください。
前提条件
開始する前に、次の内容が設定済みであることを確認してください。
-
Function Compute でカスタムドメイン名が設定済みであること。詳細については、「Configure custom domain names」をご参照ください。
JWT 認証の設定
ステップ1:カスタムドメイン名設定の表示
-
Function Compute コンソールにログインします。左側のナビゲーションペインで、[高度な機能] > [カスタムドメイン] を選択します。
-
上部メニューで、カスタムドメイン名が存在するリージョンを選択します。
-
[カスタムドメイン] ページで、設定するドメイン名をクリックします。
-
右上隅の[変更]をクリックします。
ステップ2:JWT 認証の有効化
「カスタムドメイン名の変更」ページで、[認証方法] を JWT 認証に設定します。
ステップ3:JWKS の設定
JWT 認証には、パブリックキーを含む有効な JWKS が必要です。mkjwk.org などのオンラインツールを使用して生成できます。PEM 形式のプライベートキーがある場合は、jwx などのツールを使用して JWKS 形式に変換してください。
mkjwk.org で JWKS を生成するには、[キー用途]、[アルゴリズム]、および [X.509 の表示] を設定して [生成] をクリックすると、ツールによって 2 つのキーが生成されます:
-
① プライベートキー — コード内でこれを使用して JWT トークンに署名 (発行) します。安全に保管してください。
-
② 公開鍵 — これを Function Compute コンソールの
keys配列に貼り付けます。


コンソールに貼り付ける JWKS は、次の構造に従います。
{
"keys": [
{
"alg": "RS256",
"e": "AQAB",
"kty": "RSA",
"n": "u1LWgoomekdOMfB1lEe96OHehd4XRNCbZRm96RqwOYTTc28Sc_U5wKV2umDzolfoI682ct2BNnRRahYgZPhbOCzHYM6i8sRXjz9Ghx3QHw9zrYACtArwQxrTFiejbfzDPGdPrMQg7T8wjtLtkSyDmCzeXpbIdwmxuLyt_ahLfHelr94kEksMDa42V4Fi5bMW4cCLjlEKzBEHGmFdT8UbLPCvpgsM84JK63e5ifdeI9NdadbC8ZMiR--dFCujT7AgRRyMzxgdn2l-nZJ2ZaYzbLUtAW5_U2kfRVkDNa8d1g__2V5zjU6nfLJ1S2MoXMgRgDPeHpEehZVu2kNaSFvDUQ",
"use": "sig"
}
]
}
ステップ4:JWT トークンの場所の設定
[JWT トークン設定] セクションで、[読み取り位置] (ヘッダー、Cookie、クエリパラメーター、またはフォームパラメーター) および Function Compute がトークンを検索するパラメーター名を設定します。
[読み取り位置] を ヘッダー に設定した場合は、[プレフィックスの削除] の値を指定します。 Function Compute は、トークンを解析する前にこのプレフィックスを削除します。 たとえば、プレフィックスを Bearer に設定すると、Function Compute はリクエストヘッダー Authorization: Bearer <token> から <token> を抽出して検証します。
ステップ5:クレーム転送の設定 (オプション)
[JWT クレーム変換] セクションで、JWT クレームを関数パラメーターにマッピングします。各マッピングについて、以下を指定します。
-
[マッピングパラメーター位置] — クレームを転送する場所 (Header、Cookie、Query Parameters、または Form Parameters)
-
トークン内の元のクレーム名
-
関数に渡されるパラメーター名
ステップ6:設定の保存
[保存] をクリックします。
設定の検証
前のセクションで生成したプライベートキーを使用してテスト JWT トークンを作成し、Postman を使用してドメイン名でリクエストが正しく認証されることを確認します。
テストトークンの生成
-
PyJWT モジュールをインストールします。詳細については、「PyJWT」をご参照ください。
-
次の Python スクリプトをローカルで実行してトークンを生成します。プライベートキーのプレースホルダーを、JWKS の生成手順で取得した X.509 PEM 形式のプライベートキーに置き換えてください。
import jwt
import time
private_key = """
-----BEGIN PRIVATE KEY-----
<Your X.509 PEM private key>
-----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でのテスト
-
Function Compute コンソールで、[高度な機能] > [カスタムドメイン] に移動し、カスタムドメイン名をコピーして Postman の URL フィールドに貼り付けます。
-
[JWT トークン設定] の設定と一致するリクエストヘッダーを追加します。 たとえば、パラメーター名が
Authenticationで、プレフィックスがBearerの場合:重要リクエストヘッダー内の JWT のフォーマットが、設定された [プレフィックスの削除] 設定と一致することを確認してください。一致しない場合、
invalid or expired jwtエラーが返されます。パラメーター 値 説明 Key Authorization[JWT Token Configuration] で設定したパラメーター名 Value Bearer <your-jwt-token>設定したプレフィックス、スペース、および前の手順で生成したトークン -
[送信] をクリックして、レスポンスを確認します。
クレーム転送が設定されている場合、レスポンスはクレームが関数に渡されたことを示します。たとえば、nametofunction は、クレームマッピングから転送されたパラメーター名です。