ユーザーを認証するための Firebase の使用

このページでは、API Gateway でユーザー認証をサポートする方法について説明します。

ユーザーを認証するには、クライアント アプリケーションが HTTP リクエストの承認ヘッダー内の JSON Web Token(JWT)をバックエンド API に送信する必要があります。API Gateway は API に代わってトークンを検証するので、ユーザーが自分で API にコードを追加して認証を処理する必要はありません。ただし、選択した認証方法をサポートするようにゲートウェイの API 構成を行う必要があります。

API Gateway は、JWT 発行者の JSON ウェブキー セット(JWKS)を使用して、パフォーマンスの高い方法で JWT を検証します。JWKS のロケーションは、ゲートウェイの API 構成の x-google-jwks_uri フィールドで指定されます。API Gateway は JWKS を 5 分間キャッシュに保存し、5 分ごとに更新します。

始める前に

  • Firebase Authentication のドキュメントに沿って、クライアント アプリケーションに認証コードを追加してください。Firebase では、パスワード、電話番号、Google、Facebook、Twitter など一般的なフェデレーション ID プロバイダを使用した認証がサポートされています。
    • クライアント アプリケーションが HTTP リクエストを送信する際、リクエストの承認ヘッダーには次の JWT クレームが含まれる必要があります。
      • iss(issuer)
      • sub(subject)
      • aud(audience)
      • iat(issued at)
      • exp(expiration time)

クライアント認証をサポートする API Gateway の構成

API Gateway で署名済みの JWT でクレームを検証できるように、API 構成にセキュリティ要件オブジェクトセキュリティ定義オブジェクトが設定されている必要があります。

Firebase 認証をサポートするには:

  1. OpenAPI 2.0 セキュリティ スキームに従った API 構成のセキュリティ定義に、次の内容を追加します。

     securityDefinitions:
        firebase:
          authorizationUrl: ""
          flow: "implicit"
          type: "oauth2"
          # Replace YOUR-PROJECT-ID with your project ID
          x-google-issuer: "https://securetoken.google.com/YOUR-PROJECT-ID"
          x-google-jwks_uri: "https://www.googleapis.com/service_accounts/v1/metadata/x509/securetoken@system.gserviceaccount.com"
          x-google-audiences: "YOUR-PROJECT-ID"
    
  2. security セクションを追加します。API 全体に適用する場合は API レベルに、特定のメソッドに適用する場合はメソッドレベルに追加します。

     security:
        - firebase: []
    

API 構成には複数のセキュリティ定義を定義できますが、各定義の発行者は異なっている必要があります。security セクションを API レベルとメソッド レベルの両方で指定した場合、API レベルの設定よりもメソッド レベルの設定が優先されます。

認証された呼び出しを API Gateway API に送信する

認証トークンを使用してリクエストを送信する場合は、トークンを Authorization:Bearer ヘッダーに入れることをおすすめします。次に例を示します。

curl --request POST \
  --header "Authorization: Bearer ${TOKEN}" \
  "${GATEWAY_URL}/echo"

ここで、GATEWAY_URLTOKEN はそれぞれ、デプロイされたゲートウェイ URL と認証トークンを格納する環境変数です。Authorization:Bearer ヘッダーを使用してリクエストを送信するサンプルコードについては、認証されたリクエストを API Gateway API へ送信するをご覧ください。

リクエストを送信するときにヘッダーを使用できない場合は、access_token というクエリ パラメータに認証トークンを入れることができます。たとえば次のようになります。

curl "${GATEWAY_URL}/echo?access_token=${TOKEN}"

API での認証結果の受信

通常、API Gateway は受信したすべてのヘッダーを転送します。ただし、バックエンド アドレスが API 構成の x-google-backend で指定されている場合は、元の Authorization ヘッダーより優先します。

API Gateway は認証結果を X-Apigateway-Api-Userinfo でバックエンド API に送信します。元の Authorization ヘッダーではなく、このヘッダーを使用することをおすすめします。このヘッダーは base64url エンコードされ、JWT ペイロードが含まれています。

次のステップ