メインコンテンツへスキップ
Google Cloud Endpoints(GCE)は、APIの作成、維持、およびセキュリティ保護などの機能を提供するAPI管理システムです。GCEはOpenAPIを使用して、APIのエンドポイント、入出力、エラー、およびセキュリティ記述を定義します。 OpenAPI仕様の詳細については、GitHubのOpenAPI Specification(OpenAPIの仕様)リポジトリを参照してください。 このチュートリアルでは、Auth0を使用してGoogle Cloud Endpointsをセキュリティ保護する方法を説明します。

前提条件

開始する前に、GCE APIをデプロイしておく必要があります。まだAPIを作成していない場合は、Googleドキュメントにある「Cloud Endpointsのクイックスタート」を読み、作業を完了させます。 このクイックスタートでは、3文字のIATAコードから空港名を返す/airportNameという単一のエンドポイントを持つ簡単なGCE APIを作成する手順を説明しています。
curl --request GET \
  --url 'https://%7ByourGceProject%7D.appspot.com/airportName?iataCode=SFO'

Auth0でAPIを定義する

[Auth0 Dashboard] > [Applications(アプリケーション)] > [APIs]に進み、新しいAPIを作成します。
Dashboard - APIの作成 - 統合 - Googleのエンドポイント
次のステップで使用するために、(上のスクリーンショットにあるhttp://google_api[API (APIオーディエンス)] のIDをメモしておいてください。

API構成を更新する

次に、GCE API用のOpenAPI構成ファイルを更新します。クイックスタート中に作成されたサンプルAPIでは、このファイルはopenapi.yamlとなっています。

セキュリティ定義を追加する

この構成ファイルを開き、新しくsecurityDefinitionsセクションを追加します。このセクションに、以下のフィールドを持つ新しい定義(auth0_jwt)を追加します。
フィールド説明
authorizationUrl認可URLで、"https://{yourDomain}/authorize"に設定する必要があります。
flowOAuth2のセキュリティスキームで使用されるフローです。有効な値は"implicit""password""application""accessCode"です。
typeセキュリティスキームの種類です。有効な値は"basic""apiKey""oauth2"です。
x-google-issuer資格情報の発行者で、"https://{yourDomain}/"に設定する必要があります。
x-google-jwks_uri署名の検証に使用される公開鍵のURIです。これは"https://{yourDomain}/.well-known/jwks.json"に指定します。
x-google-audiencesAPIの識別子です。この値が、Auth0 DashboardでAPIに定義したものと一致することを確認してください。
securityDefinitions:
  auth0_jwt:
    authorizationUrl: "https://{yourDomain}/authorize"
    flow: "implicit"
    type: "oauth2"
    x-google-issuer: "https://{yourDomain}/"
    x-google-jwks_uri: "https://{yourDomain}/.well-known/jwks.json"
    x-google-audiences: "{yourApiIdentifier}"

エンドポイントを更新する

次に、前のステップで作成したsecurityDefinitionを使用してsecurityフィールドを追加し、エンドポイントを更新します。
paths:
  "/airportName":
    get:
      description: "Get the airport name for a given IATA code."
      operationId: "airportName"
      parameters:
        -
          name: iataCode
          in: query
          required: true
          type: string
      responses:
        200:
          description: "Success."
          schema:
            type: string
        400:
          description: "The IATA code is invalid or missing."
      security:
       - auth0_jwt: []
上の例では、securityフィールドがGCEプロキシに、/airportNameパスがauth0-jwtでセキュリティ保護されていることが期待されていることを伝えています。 OpenAPIの構成が更新されると、以下のようになります。
---
swagger: "2.0"
info:
  title: "Airport Codes"
  description: "Get the name of an airport from its three-letter IATA code."
  version: "1.0.0"
host: "{yourGceProject}.appspot.com"
schemes:
  - "https"
paths:
  "/airportName":
    get:
      description: "Get the airport name for a given IATA code."
      operationId: "airportName"
      parameters:
        -
          name: iataCode
          in: query
          required: true
          type: string
      responses:
        200:
          description: "Success."
          schema:
            type: string
        400:
          description: "The IATA code is invalid or missing."
      security:
       - auth0_jwt: []
securityDefinitions:
  auth0_jwt:
    authorizationUrl: "https://{yourDomain}/authorize"
    flow: "implicit"
    type: "oauth2"
    x-google-issuer: "https://{yourDomain}/"
    x-google-jwks_uri: "https://{yourDomain}/.well-known/jwks.json"
    x-google-audiences: "{yourApiIdentifier}"

APIを再デプロイする

次に、GCE APIを再デプロイして、構成変更を適用します。Cloud Endpointsのクイックスタートに従った場合は、GoogleのCloud Shellに以下を入力することで再デプロイすることができます。
cd endpoints-quickstart/scripts
./deploy_api.sh

APIをテストする

再デプロイが完了したら、セキュリティなしでAPIを再度呼び出します。
curl --request GET \
  --url 'https://%7ByourGceProject%7D.appspot.com/airportName?iataCode=SFO'
以下のような応答が返されます。
{
 "code": 16,
 "message": "JWT validation failed: Missing or invalid credentials",
 "details": [
  {
   "@type": "type.googleapis.com/google.rpc.DebugInfo",
   "stackEntries": [],
   "detail": "auth"
  }
 ]
}
期待どおりの結果です。 次に、Auth0 DashboardのGoogle Endpoints API定義の [Test(テスト)] ページに移動し、[Response(応答)]の下にあるアクセストークンをコピーします。 Authorization Header(認可ヘッダー)にBearer {ACCESS_TOKEN}を設定し、APIに対してGET要求を実行することで、認可されたアクセスを取得します。
curl --request GET \
  --url 'https://%7ByourGceProject%7D.appspot.com/airportName?iataCode=SFO' \
  --header 'authorization: Bearer {accessToken}'
これで作業完了です。
I