すべてのプロダクト
Search
ドキュメントセンター

Function Compute:HTTPトリガーのJWT認証の設定

最終更新日:Jul 24, 2024

Function Computeでは、HTTPトリガーのJSON Web Token (JWT) 認証を設定して、有効なJWTを持つクライアントのみが関数にアクセスできるようにします。 これにより、HTTPサービスのセキュリティが強化され、不正アクセスや悪意のある攻撃が効果的に防止されます。

背景情報

概要

Function Computeでは、HTTPトリガーのJWT認証を有効にできます。 JWT (RFC 7519) は、リクエストを認証するための使いやすいトークンベースの方法です。 ユーザステータス情報は、クライアントによって提供されるトークンに格納される。 関数またはサーバーはトークンを保存しません。 したがって、この方法は、サーバーレスアプリケーションに特に適しています。 Function Computeは、HTTPトリガー用に設定されたパブリックJSON Webキーセット (JWKS) を使用して、HTTPリクエストにJWT認証を実装できます。 Function Computeは、HTTPトリガーの設定に基づいてクレームを関数に転送します。 これにより、関数ではリクエスト認証が不要になり、ビジネスロジックに集中できます。 認証プロセスの詳細とJWTのトークンに関する基本情報については、「JWTベースの認証」および「JSON Webトークンの概要」をご参照ください。

JWT认证プロセス

image

上の図は、Function ComputeのHTTPトリガーに対するJWT認証のワークフローを示しています。 このプロセスでは、非対称暗号化アルゴリズムが使用される。 次の項目は、プロセスの詳細を説明します。

  1. クライアントは、認証要求をカスタム認証サービスに送信します。 ほとんどの場合、リクエストにはユーザー名とパスワードが指定されています。

  2. カスタム認証サービスは、リクエスト内のユーザー名やパスワードなどの認証情報を読み取り、検証します。 リクエストが検証に合格した後、認証サービスは秘密鍵を使用して標準のトークンを生成します。

  3. カスタム認証サービスは、トークンを含む応答をクライアントに転送します。 クライアントは、トークンをオンプレミスのマシンにキャッシュします。

  4. クライアントは、トークンを含むビジネスリクエストをHTTPトリガーに送信します。

  5. HTTPトリガーは、設定された公開キーを使用して、リクエスト内のトークンを検証します。

  6. 検証に合格した後、リクエストは保護された関数に渡されます。

  7. protected関数はリクエストを処理し、レスポンスを返します。

  8. HTTPトリガーは、ビジネス応答をクライアントに転送します。

前提条件

関数とHTTPトリガーが作成されます。 詳細については、「関数の作成」および「手順1: トリガーの作成」をご参照ください。

制限事項

  • ビジネス要件に基づいた方法でJWTを生成および配布できます。 Function Computeは、HTTPトリガー用に設定されたパブリックJWKSを使用してJWTを認証します。

  • kid (キーID) なしのJSON Webキー (JWK) がサポートされています。

  • トークンは、ヘッダークエリパラメーター (GETメソッドを使用) 、フォームパラメーター (POSTメソッドを使用) 、またはcookieから読み取ることができます。

  • クレームヘッダークエリパラメーター (GETメソッドを使用) 、フォームパラメーター (POSTメソッドを使用) 、またはCookieとして関数に転送できます。

  • HTTPトリガーのJWKSを設定できます。 JWKSが設定された後、システムは、トークン内のkidに一致するkidを持つパブリックJWKをJWKSから検索し、このパブリックJWKを使用してトークンの署名を検証します。 トリガーのJWKSのJWKのkidを最大1つだけ指定しないか、空の文字列に設定できます。

    次の表に、Function ComputeのJWTでサポートされているアルゴリズムを示します。

    署名アルゴリズム

    alg value

    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を使用して、リクエスト内のトークンなどの機密情報を保護し、トークンのリークを防ぐことを推奨します。

手順

ステップ1: JWT認証の設定

  1. Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[関数] をクリックします。

  2. 上部のナビゲーションバーで、リージョンを選択します。 [関数] ページで、管理する関数をクリックします。

  3. 機能の詳細ページの下部で、[設定] タブをクリックします。 左側のナビゲーションウィンドウで、[トリガー] をクリックします。 表示されるページで、HTTPトリガーを見つけ、[操作] 列の [変更] をクリックします。

  4. [トリガーの変更] パネルで、次のパラメーターを設定し、OKをクリックします。

    1. [認証方法][JWT認証] に設定します。

      image

    2. JWKSを設定します。

      HTTPトリガーのJWT認証を設定するには、有効なJWKSを指定する必要があります。 JWKSを自分で生成するか、WebブラウザーでJSON web Keyジェネレーターで検索して、mkjwk.orgなどのオンラインジェネレーターを取得できます。 PEM形式のキーがある場合は、jwxなどのツールを使用してキーをJWKS形式に変換できます。

      このトピックでは、mkjwk.orgを例として使用して、JWKSを生成する方法について説明します。 次の図に示す例では、[キーの使用][署名] に、[アルゴリズム][RS256] に、[X.509を表示][はい] に設定し、[生成] をクリックして秘密鍵を生成します。 コードでは、秘密鍵を使用してJWTを発行する必要があります。 公開鍵の内容をコピーし、コピーした内容をコンソールのJWKS入力ボックスに貼り付けます。

      image.png

      image

      次のサンプルコードは、設定されたJWKSを示しています。

      {
          "keys": [
              {
                  "alg": "RS256",
                  "e": "AQAB" 、
                  "kty": "RSA" 、
                  "n": "u1LWgoomekdOMfB1lEe96OHehd4XRNCbZRm96RqwOYTTc28Sc_U5wKV2umDzolfoI682ct2BNnRRahYgZPhbOCzHYM6i8sRXjz9Ghx3QHw9zrYACtArwQxrTFiejbfzDPGdPrMQg7T8wjtLtkSyDmCzeXpbIdwmxuLyt_ahLfHelr94kEksMDa42V4Fi5bMW4cCLjlEKzBEHGmFdT8UbLPCvpgsM84JK63e5ifdeI9NdadbC8ZMiR -- dFCujT7AgRRyMzxgdn2l-nZJ2ZaYzbLUtAW5_U2kfRVkDNa8d1g__2V5zjU6nfLJ1S2MoXMgRgDPeHpEehZVu2kNaSFvDUQ" 、
                  "use": "sig"
              }
          ]
      }
    3. [JWTトークン設定] セクションで、トークンを読み取る位置とトークンの名前を選択します。

      トークンの読み取り位置パラメーターをヘッダー、Cookie、クエリパラメーター、またはフォームパラメーターに設定できます。 トークンの読み取り位置をヘッダーに設定した場合、プレフィックスを指定する必要があります。 Function Computeは、トークンを取得するときにこのプレフィックスを削除します。

      image

    4. JWTクレーム変換セクションで、関数にパラメーターを渡す位置、パラメーターの元の名前、および関数に渡された後のパラメーターの新しい名前を選択します。

      マッピングパラメーターの位置をヘッダー、Cookie、クエリパラメーター、またはフォームパラメーターに設定できます。

      image

    5. 要求マッチングモードを設定します。 次のマッチングモードがサポートされています。

      • すべて一致: すべてのHTTPリクエストは、JWTを使用して検証する必要があります。

      • ホワイトリストモード: [リクエストパスのホワイトリスト] で指定されたパスから送信されるHTTPリクエストは、JWTを使用して認証されません。 他の要求は、JWTを使用して認証される。

      • ブラックリストモード: [リクエストパスのブラックリスト] で指定されたパスから送信されたHTTPリクエストは、JWTを使用して認証されます。 その他のリクエストは、JWTを使用して認証されません。

      ホワイトリストモードブラックリストモードは、次の対応モードをサポートしています。

      • 完全一致

        パスは、指定されたパスとまったく同じ場合にのみ一致します。 たとえば、[リクエストパスのブラックリスト]/aに設定した場合、/aから送信されるリクエストにはJWT認証が必要です。 /a/ から送信されないリクエストには、JWT認証は必要ありません。

      • ファジーマッチ

        ワイルドカードとしてアスタリスク (*) が付加されたパスに値を設定できます。 たとえば、[リクエストパスのブラックリスト]/login/* に設定した場合、プレフィックスが /login/ のパス (/login/a/login/b/c/dなど) から送信されるリクエストは、JWT認証される必要があります。

ステップ2: JWT認証の検証

Postmanなどのツールに、アクセスするURLや使用するトークンなどの情報を入力して、HTTPサービスにアクセスできるかどうかを確認します。

  1. 手順1: JWT認証の設定」で生成された秘密鍵を使用して、JWTを作成します。

  2. Postmanを使用して、HTTPサービスに期待どおりにアクセスできるかどうかを確認します。

    1. [設定] > [トリガー] タブからインターネットURLを取得し、PostmanにURLを入力します。

    2. Postmanの [ヘッダー] タブでトークンパラメーターを設定します。 次の表に例を示します。

      説明

      Key

      認証

      [JWTトークン設定] セクションで指定したトークンの名前。

      ベアラーeyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiSm9uIFNub3ciLCJhZG1pbiI6dHJ1ZSwiZXhwIjo0ODI5NTk3NjQxfQ.eRcobbpjAd3OSMxcWbmbicOTLjO2vuLR9F2QZMK4rz1JqfSRHgwQVqNxcfOIO9ckDMNlF_3jtdfCfvXfka-phJZpHmnaQJxmnOA8zA3R4wF4GUQdz5zkt74cK9jLAXpokwrviz2ROehwxTCwa0naRd_N9eFhvTRnP3u7L0xn3ll4iOf8Q4jS0mVLpjyTa5WiBkN5xi9hkFxd__p98Pah_Yf0hVQ2ldGSyTtAMmdM1Bvzad-kdZ_wW0jcctIla9bLnOo-Enr14EsGvziMh_QTZ3HQtJuToSKZ11xkNgaz7an5de6PuF5ISXQzxigpFVIkG765aEDVtEnFkMO0xyPGLg

      トークンの読み取りに使用されるヘッダー。 削除するプレフィックスとトークンの間にスペースを残す必要があります。 プレフィックスを除いたヘッダ部分がトークンとして使用される。

    3. [送信] をクリックし、HTTPサービスの返された情報を表示します。 次の図に例を示します。

      image.png

      返された情報のnametofunctionは、クレームによって関数に渡される名前を示します。

FAQ

ドメイン名のjwt認証を有効にした後、カスタムドメイン名にアクセスすると、「invalidまたはexpired JWT」が返されるのはなぜですか。

メッセージは、JWT認証が失敗したことを示す。 考えられる原因は次のとおりです。

  • トークンの署名または形式が無効です。

  • トークンの有効期限が切れています。

  • トークンのキーIDが、カスタムドメイン名に設定したJWKSと一致しないか、一致したJWKが正確ではありません。

カスタムドメイン名のjwt認証を有効にした後、カスタムドメイン名にアクセスすると、「JWT token is missing」が返されるのはなぜですか。

このメッセージは、Function Computeがカスタムドメイン名のJWTトークンの設定に基づいてトークンを見つけることができないことを示しています。 トークンがリクエストに含まれているか、読み取り位置または名前が正しく指定されているかを確認します。 [JWTトークン設定] セクションの [読み取り位置] パラメーターを [ヘッダー] に設定した場合、トークンを設定するときに [プレフィックスの削除] パラメーターの値を追加し、値とJWTトークンの間にスペースを残す必要があります。 それ以外の場合は、エラーが返されます。

JWT認証の料金はかかりますか?

いいえ、JWT認証に対して課金されません。 デフォルトでは、Function Computeが提供するゲートウェイ関連の機能に対して、関数の呼び出し数に基づいて課金されます。 したがって、この機能を有効にするかどうかに関係なく、JWT認証の料金は発生しません。