ユーザーの認証

このページでは、Cloud Endpoints Frameworks を使用して API でクライアント アプリケーションからのユーザー認証をサポートする方法について説明します。現在サポートされているクライアントは、Android クライアントと JavaScript クライアントです。

Endpoints Frameworks では、以下のいずれかの方式を使用するクライアント アプリケーションからのユーザー認証をサポートしています。

どの認証方法を使用する場合でも、適切な認証情報かどうかを確認する各 API メソッドで、以下のセクションの説明に従って有効な User かどうかを確認する必要があります。

前提条件

すでに以下を行っていることを前提としています。

Firebase Authentication による認証

Firebase Authentication を使用するクライアントからの呼び出しをサポートするには:

  1. まだ作成していない場合は、プロジェクトを作成します。Firebase プロジェクトは、Firebase のサービスを使用する Google Cloud Console プロジェクトです。詳細については、Firebase プロジェクトとはFirebase のドキュメントをご覧ください。

  2. @Api またはメソッドのアノテーションに以下を追加します。

    • アノテーションに authenticators パラメータを追加して、その値を {EspAuthenticator.class} に設定します。
    • @ApiIssuer を含む issuers パラメータを追加します。
    • Firebase と実際のプロジェクト ID に設定した @ApiIssuerAudience を含む issuerAudiences パラメータを追加します。

    例:

    @Api(
        name = "YOUR_API_NAME",
        version = "VERSION_NUMBER",
        authenticators = {EspAuthenticator.class},
        issuers = {
            @ApiIssuer(
                name = "firebase",
                issuer = "https://securetoken.google.com/YOUR_PROJECT_ID",
                jwksUri = "https://www.googleapis.com/service_accounts/v1/metadata/x509/securetoken@system.gserviceaccount.com")
        },
        issuerAudiences = {
            @ApiIssuerAudience(name = "firebase", audiences = "YOUR_PROJECT_ID")
        })
    
    • YOUR_API_NAME は、API の名前に置き換えます。
    • VERSION_NUMBER は、実際の API バージョンで置き換えます(例: v1)。
    • YOUR_PROJECT_ID は両方とも、実際の Firebase プロジェクト ID で置き換えます。
  3. API の実装コードに Users をインポートします。

    import com.google.api.server.spi.auth.common.User;
    
  4. 次のメソッド定義例のように、認証情報が正しいかどうかを確認する各 API メソッドで、有効な User が存在するかどうかを確認して、存在しない場合は例外をスローします。

    @ApiMethod(httpMethod = ApiMethod.HttpMethod.GET)
    public Email getUserEmail(User user) throws UnauthorizedException {
      if (user == null) {
        throw new UnauthorizedException("Invalid credentials");
      }
    
      Email response = new Email();
      response.setEmail(user.getEmail());
      return response;
    }
    
  5. 新しいクライアントを追加するときは必ず、API を再デプロイしてください

クライアントに Firebase 認証を追加する

コードに Firebase Authentication を追加する方法については、Firebase のドキュメントをご覧ください。クライアントに Google Cloud プロジェクトが関連付けられていて、上記のセクションに示されているように、そのプロジェクト ID が API の Firebase issuer の構成に含まれている必要があります。

Auth0 による認証

Auth0 を使用するクライアントからの呼び出しをサポートするには:

  1. @Api またはメソッドのアノテーションに以下を追加します。

    • アノテーションに authenticators パラメータを追加して、その値を {EspAuthenticator.class} に設定します。
    • Auth0 に設定した @ApiIssuer を含む issuers パラメータを追加します。
    • Auth0 と実際の Auth0 クライアント ID に設定した @ApiIssuerAudience を含む issuerAudiences パラメータを追加します。

    例:

    @Api(
        name = "YOUR_API_NAME",
        version = "VERSION_NUMBER",
        authenticators = {EspAuthenticator.class},
        issuers = {
            @ApiIssuer(
                name = "auth0",
                issuer = "https://YOUR_ACCOUNT_NAME.auth0.com/",
                jwksUri = "https://YOUR_ACCOUNT_NAME.auth0.com/.well-known/jwks.json")
         },
         issuerAudiences = {
             @ApiIssuerAudience(name = "auth0", audiences = "AUTH0_CLIENT_ID")
        })
    
    • YOUR_API_NAME は、API の名前に置き換えます。
    • VERSION_NUMBER は、実際の API バージョンで置き換えます(例: v1)。
    • YOUR_ACCOUNT_NAME は、クライアントに使用する Auth0 アカウント名で置き換えます。
    • AUTH0_CLIENT_ID は、クライアントに使用する ID で置き換えます。
  2. API の実装コードに Users をインポートします。

    import com.google.api.server.spi.auth.common.User;
    
  3. 次のメソッド定義例のように、認証情報が正しいかどうかを確認する各 API メソッドで、有効な User が存在するかどうかを確認して、存在しない場合は例外をスローします。

    @ApiMethod(httpMethod = ApiMethod.HttpMethod.GET)
    public Email getUserEmail(User user) throws UnauthorizedException {
      if (user == null) {
        throw new UnauthorizedException("Invalid credentials");
      }
    
      Email response = new Email();
      response.setEmail(user.getEmail());
      return response;
    }
    
  4. 新しいクライアントを追加するときは必ず、API を再デプロイしてください

クライアントに Auth0 認証を追加する

コードに Auth0 認証を追加する方法については、Auth0 のドキュメントをご覧ください。クライアントが API における Auth0 issuer の構成に含まれている必要があります。

Google ID トークンによる認証

Google ID トークンを使用して認証するクライアントからの呼び出しをサポートするには:

  1. クライアント アプリケーションごとに OAuth 2 クライアント ID を取得します。このクライアント ID は、クライアント アプリケーションのオーナーが Google Cloud Console で生成する必要があります。手順については、クライアント ID の作成をご覧ください。

  2. @Api アノテーションに、アクセス権を付与する各クライアント アプリのクライアント ID を含む clientIds エントリと、各 Android クライアントの audiences エントリを追加します。

    例:

    @Api(
       name = "YOUR_API_NAME",
       version = "VERSION_NUMBER",
       clientIds = {"YOUR_CLIENT_ID"},
       audiences = {"YOUR_CLIENT_ID"}
    )
    
    • YOUR_API_NAME は、API の名前に置き換えます。
    • VERSION_NUMBER は、実際の API バージョンで置き換えます(例: v1)。
    • YOUR_CLIENT_ID は、クライアント アプリケーションのプロジェクト内で生成された OAuth 2 クライアント ID で置き換えます。
  3. API の実装コードに Users をインポートします。

    import com.google.api.server.spi.auth.common.User;
    
  4. 次のメソッド定義例のように、認証情報が正しいかどうかを確認する各 API メソッドで、有効な User が存在するかどうかを確認して、存在しない場合は例外をスローします。

    @ApiMethod(httpMethod = ApiMethod.HttpMethod.GET)
    public Email getUserEmail(User user) throws UnauthorizedException {
      if (user == null) {
        throw new UnauthorizedException("Invalid credentials");
      }
    
      Email response = new Email();
      response.setEmail(user.getEmail());
      return response;
    }
    
  5. 新しいクライアントを追加するときは必ず、API を再デプロイしてください

クライアントに Google ID トークン認証を追加する

クライアントに認証コードを追加する方法については、以下を参照してください。

クライアントの JWT を送信する

クライアントで JWT を使用して認証済みリクエストを API に送信する場合は、JWT を HTTP リクエストの Authorization ヘッダーに含める必要があります。JWT には次の必須のクレームが含まれている必要があります。

  • iss
  • sub
  • aud
  • iat
  • exp

次のステップ

ユーザー認証の背景情報や、ユーザー認証と API キー承認の違いについては、API キーを使用する理由と条件をご覧ください。