サーバー間アプリケーションにOAuth2.0を使用する

Google OAuth 2.0システムは、WebアプリケーションとGoogleサービス間の相互作用などのサーバー間の相互作用をサポートします。このシナリオでは、あなたのアプリケーションにはなく、個々のエンドユーザーに属するアカウントであるサービスアカウントが必要です。アプリケーションはサービスアカウントに代わってGoogleAPIを呼び出すため、ユーザーが直接関与することはありません。このシナリオは、「2本足のOAuth」または「2LO」と呼ばれることもあります。 (関連用語「3本足のOAuth」は、アプリケーションがエンドユーザーに代わってGoogle APIを呼び出し、ユーザーの同意が必要になる場合があるシナリオを指します。)

通常、アプリケーションがGoogle APIを使用してユーザーのデータではなく独自のデータを処理する場合、アプリケーションはサービスアカウントを使用します。たとえば、データの永続性のためにGoogle Cloud Datastoreを使用するアプリケーションは、サービスアカウントを使用してGoogle Cloud DatastoreAPIへの呼び出しを認証します。

Googleのワークスペースドメイン管理者は、できるサービスはドメイン全体の権限を付与アカウントドメイン内のユーザーに代わってアクセスユーザーデータへ。

このドキュメントでは、アプリケーションがGoogle APIクライアントライブラリ(推奨)またはHTTPのいずれかを使用してサーバー間OAuth2.0フローを完了する方法について説明します。

概要

サポートサーバー間の相互作用に、最初にプロジェクトのためのサービスアカウントを作成 API Console。 Google Workspaceアカウントのユーザーのユーザーデータにアクセスする場合は、ドメイン全体のアクセスをサービスアカウントに委任します。

次に、アプリケーションは、サービスアカウントの資格情報を使用して、OAuth 2.0認証サーバーからアクセストークンを要求することにより、承認されたAPI呼び出しを行う準備をします。

最後に、アプリケーションはアクセストークンを使用してGoogleAPIを呼び出すことができます。

サービスアカウントの作成

サービスアカウントのクレデンシャルには、一意の生成された電子メールアドレスと、少なくとも1つの公開鍵と秘密鍵のペアが含まれます。ドメイン全体の委任が有効になっている場合、クライアントIDもサービスアカウントの資格情報の一部になります。

アプリケーションがGoogleApp Engineで実行されている場合、プロジェクトの作成時にサービスアカウントが自動的に設定されます。

アプリケーションがGoogleCompute Engineで実行されている場合、プロジェクトの作成時にサービスアカウントも自動的に設定されますが、Google ComputeEngineインスタンスの作成時にアプリケーションがアクセスする必要のあるスコープを指定する必要があります。詳細については、使用するサービスアカウントにインスタンスを準備します

アプリケーションがGoogle App EngineのやGoogle Compute Engineの上で実行されない場合は、これらの資格を取得する必要があり Google API Console。サービスアカウントのクレデンシャルを生成する、またはすでに生成したパブリッククレデンシャルを表示するには、次の手順を実行します。

First, create a service account:

  1. Open the Service accounts page.
  2. If prompted, select a project, or create a new one.
  3. Click  Create service account.
  4. Under Service account details, type a name, ID, and description for the service account, then click Create and continue.
  5. Optional: Under Grant this service account access to project, select the IAM roles to grant to the service account.
  6. Click Continue.
  7. Optional: Under Grant users access to this service account, add the users or groups that are allowed to use and manage the service account.
  8. Click Done.
  9. Click  Create key, then click Create.

Next, create a service account key:

  1. Click the email address for the service account you created.
  2. Click the Keys tab.
  3. In the Add key drop-down list, select Create new key.
  4. Click Create.

Your new public/private key pair is generated and downloaded to your machine; it serves as the only copy of the private key. You are responsible for storing it securely. If you lose this key pair, you will need to generate a new one.

あなたはに戻ることができ API Consoleメールアドレス、公開鍵の指紋、およびその他の情報を表示するには、任意の時点で、または追加の公開鍵/秘密鍵のペアを生成します。で、サービスアカウントの資格情報の詳細については API Console、参照サービスアカウントに API Consoleヘルプファイル。

サービスアカウントの電子メールアドレスをメモし、アプリケーションがアクセスできる場所にサービスアカウントの秘密鍵ファイルを保存します。アプリケーションでは、承認されたAPI呼び出しを行うためにそれらが必要です。

ドメイン全体の権限をサービスアカウントに委任する

Google Workspaceアカウントをお持ちの場合、組織の管理者は、GoogleWorkspaceドメインのユーザーに代わってユーザーデータにアクセスすることをアプリケーションに許可できます。たとえば、Google Calendar APIを使用してGoogleWorkspaceドメイン内のすべてのユーザーのカレンダーにイベントを追加するアプリケーションは、ユーザーに代わってサービスアカウントを使用してGoogle CalendarAPIにアクセスします。ドメイン内のユーザーに代わってデータにアクセスすることをサービスアカウントに許可することは、サービスアカウントへの「ドメイン全体の権限の委任」と呼ばれることもあります。

ドメイン全体の権限をサービスアカウントに委任するには、GoogleWorkspaceドメインのスーパー管理者が次の手順を実行する必要があります。

  1. あなたのGoogleのワークスペースドメインのから管理コンソールメインメニューに移動し > [セキュリティ]> [APIを制御します。
  2. ドメイン全体の委任]ペインで、ドメイン全体の委任の管理]選択します。
  3. クリックして新しいを追加します
  4. クライアントIDフィールドに、サービスアカウントのクライアントIDを入力してください。あなたには、あなたのサービスアカウントのクライアントIDを見つけることができます Service accounts page
  5. OAuthのスコープ(カンマ区切り)]フィールドで、アプリケーションがへのアクセスを許可する必要があることをスコープのリストを入力します。たとえば、アプリケーションがGoogleドライブのAPIとGoogleカレンダーのAPIにドメイン全体のフルアクセスを必要とする場合、次のように入力しますhttps://www.googleapis.com/auth/drive、https://www.googleapis.com/auth /カレンダー
  6. 承認をクリックします。

これで、アプリケーションは、ドメイン内のユーザーとしてAPI呼び出しを行う権限を持ちます(ユーザーを「偽装」するため)。承認されたAPI呼び出しを行う準備をするときは、偽装するユーザーを指定します。

承認されたAPI呼び出しを行う準備をしています

Java

あなたがから、クライアントのメールアドレスと秘密鍵を取得した後 API Console、使用するJava用のGoogle APIクライアントライブラリを作成するためにGoogleCredentialサービスアカウントの資格情報からオブジェクトを、アプリケーションがアクセスを必要とするスコープ。例えば:

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.services.sqladmin.SQLAdminScopes;

// ...

GoogleCredential credential = GoogleCredential.fromStream(new FileInputStream("MyProject-1234.json"))
    .createScoped(Collections.singleton(SQLAdminScopes.SQLSERVICE_ADMIN));

あなたはGoogleのクラウドプラットフォーム上のアプリを開発している場合は、使用できるアプリケーションのデフォルトの資格情報をプロセスを簡素化することができ、代わりに。

ドメイン全体の権限を委任する

サービスアカウントにドメイン全体のアクセス権を委任したとユーザーアカウントを偽装したい場合は、を持つユーザーアカウントの電子メールアドレスを指定createDelegated方法GoogleCredentialオブジェクト。例えば:

GoogleCredential credential = GoogleCredential.fromStream(new FileInputStream("MyProject-1234.json"))
    .createScoped(Collections.singleton(SQLAdminScopes.SQLSERVICE_ADMIN))
    .createDelegated("user@example.com");

使用GoogleCredentialアプリケーションは、GoogleのAPIを呼び出すためにオブジェクトを。

Python

あなたからのクライアントのメールアドレスと秘密鍵を取得した後、 API Console、使用Python用のGoogle APIクライアントライブラリを、以下の手順を実行します:

  1. 作成Credentialsサービスアカウントの資格情報からオブジェクトを、アプリケーションがアクセスを必要とするスコープ。例えば:
    from google.oauth2 import service_account
    
    SCOPES = ['https://www.googleapis.com/auth/sqlservice.admin']
    SERVICE_ACCOUNT_FILE = '/path/to/service.json'
    
    credentials = service_account.Credentials.from_service_account_file(
            SERVICE_ACCOUNT_FILE, scopes=SCOPES)

    あなたはGoogleのクラウドプラットフォーム上のアプリを開発している場合は、使用できるアプリケーションのデフォルトの資格情報をプロセスを簡素化することができ、代わりに。

  2. ドメイン全体の権限を委任する

    サービスアカウントにドメイン全体のアクセス権を委任したとユーザーアカウントを偽装したい場合は、使用with_subject既存の方法ServiceAccountCredentialsオブジェクトを。例えば:

    delegated_credentials = credentials.with_subject('user@example.org')

Credentialsオブジェクトを使用して、アプリケーションでGoogleAPIを呼び出します。

HTTP / REST

あなたからのクライアントIDと秘密鍵を取得した後 API Console、あなたのアプリケーションは、以下のステップを完了する必要があります。

  1. ヘッダー、クレームセット、および署名を含むJSON Webトークン(JWT、発音、「jot」)を作成します。
  2. Google OAuth 2.0 AuthorizationServerにアクセストークンをリクエストします。
  3. AuthorizationServerが返すJSON応答を処理します。

次のセクションでは、これらの手順を完了する方法について説明します。

応答は、アクセストークンが含まれている場合、あなたはしてアクセストークンを使用することができ、GoogleのAPIを呼び出します。 (応答にアクセストークンが含まれていない場合、JWTとトークンのリクエストが適切に形成されていないか、サービスアカウントにリクエストされたスコープにアクセスする権限がない可能性があります。)

アクセストークンは、ときに有効期限が切れると、アプリケーションは別のJWT、看板、それを生成し、別のアクセストークンを要求します。

サーバーアプリケーションは、JWTを使用してGoogle Authorization Serverにトークンをリクエストし、そのトークンを使用してGoogleAPIエンドポイントを呼び出します。エンドユーザーは関与しません。

このセクションの残りの部分では、JWTの作成、JWTへの署名、アクセストークン要求の形成、および応答の処理の詳細について説明します。

JWTの作成

JWTは、ヘッダー、クレームセット、署名の3つの部分で構成されています。ヘッダーとクレームセットはJSONオブジェクトです。これらのJSONオブジェクトはUTF-8バイトにシリアル化され、Base64urlエンコーディングを使用してエンコードされます。このエンコーディングは、繰り返しのエンコーディング操作によるエンコーディングの変更に対する回復力を提供します。ヘッダ、クレームセット、及び署名は期間(一緒に連結されている. )文字。

JWTは次のように構成されます。

{Base64url encoded header}.{Base64url encoded claim set}.{Base64url encoded signature}

署名の基本文字列は次のとおりです。

{Base64url encoded header}.{Base64url encoded claim set}
JWTヘッダーの形成

ヘッダーは、署名アルゴリズムとアサーションの形式を示す2つのフィールドで構成されます。両方のフィールドは必須であり、各フィールドには1つの値しかありません。追加のアルゴリズムとフォーマットが導入されると、このヘッダーはそれに応じて変更されます。

サービスアカウントは、RSASHA-256アルゴリズムとJWTトークン形式に依存しています。その結果、ヘッダーのJSON表現は次のようになります。

{"alg":"RS256","typ":"JWT"}

これのBase64url表現は次のとおりです。

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9
JWTクレームセットの形成

JWTクレームセットには、要求されているアクセス許可(スコープ)、トークンのターゲット、発行者、トークンが発行された時刻、トークンの有効期間など、JWTに関する情報が含まれています。ほとんどのフィールドは必須です。 JWTヘッダーと同様に、JWTクレームセットはJSONオブジェクトであり、署名の計算に使用されます。

必要なクレーム

JWTクレームセットに必要なクレームを以下に示します。それらは、クレームセット内で任意の順序で表示される場合があります。

名前説明
issサービスアカウントのメールアドレス。
scopeアプリケーションが要求する権限のスペース区切りのリスト。
audアサーションの意図されたターゲットの記述子。アクセストークン要求をするとき、この値は常にあるhttps://oauth2.googleapis.com/token
expアサーションの有効期限。1970年1月1日00:00:00UTCからの秒数で指定されます。この値の最大値は発行時刻から1時間後です。
iatアサーションが発行された時刻。1970年1月1日00:00:00UTCからの秒数として指定されます。

JWTクレームセットの必須フィールドのJSON表現を以下に示します。

{
  "iss": "761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com",
  "scope": "https://www.googleapis.com/auth/devstorage.read_only",
  "aud": "https://oauth2.googleapis.com/token",
  "exp": 1328554385,
  "iat": 1328550785
}
追加のクレーム

一部の企業の場合、アプリケーションはドメイン全体の委任を使用して、組織内の特定のユーザーに代わって動作することができます。このタイプの偽装を実行する権限は、アプリケーションがユーザーに偽装する前に付与する必要があり、通常はスーパー管理者によって処理されます。詳細については、ドメイン全体の代表団とのコントロールAPIへのアクセスを

リソースへのアクセスを委任するアプリケーションを許可するアクセストークンを取得するための値としてJWTクレームセット内のユーザの電子メールアドレスを含むsubフィールド。

名前説明
subアプリケーションが委任されたアクセスを要求しているユーザーの電子メールアドレス。

アプリケーションがユーザーを偽装する権限を持っていない場合は、含まれるアクセストークンの要求に応じてsubフィールドになりますエラー

含むJWTクレームセットの例subフィールドを以下に示します。

{
  "iss": "761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com",
  "sub": "some.user@example.com",
  "scope": "https://www.googleapis.com/auth/prediction",
  "aud": "https://oauth2.googleapis.com/token",
  "exp": 1328554385,
  "iat": 1328550785
}
JWTクレームセットのエンコード

JWTヘッダーと同様に、JWTクレームセットはUTF-8にシリアル化され、Base64urlセーフでエンコードされる必要があります。以下は、JWTクレームセットのJSON表現の例です。

{
  "iss": "761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com",
  "scope": "https://www.googleapis.com/auth/prediction",
  "aud": "https://oauth2.googleapis.com/token",
  "exp": 1328554385,
  "iat": 1328550785
}
署名の計算

JSONウェブ署名(JWS)はJWTの署名を生成する仕組みを案内する仕様です。署名の入力は、次のコンテンツのバイト配列です。

{Base64url encoded header}.{Base64url encoded claim set}

署名を計算するときは、JWTヘッダーの署名アルゴリズムを使用する必要があります。 Google OAuth 2.0 Authorization Serverでサポートされている唯一の署名アルゴリズムは、SHA-256ハッシュアルゴリズムを使用したRSAです。これは次のように表現されているRS256におけるalg JWTヘッダーのフィールド。

得られた秘密鍵を用いて(また、SHA-256ハッシュ関数とRSASSA-PKCS1-v1_5の-SIGNとも呼ばれる)SHA256withRSAを使用して入力のUTF-8表現サイン Google API Console。出力はバイト配列になります。

その場合、署名はBase64urlでエンコードする必要があります。ヘッダ、クレームセット、及び署名は期間(一緒に連結されている. )文字。結果がJWTです。次のようになります(わかりやすくするために改行を追加)。

{Base64url encoded header}.
{Base64url encoded claim set}.
{Base64url encoded signature}

以下は、Base64urlエンコーディング前のJWTの例です。

{"alg":"RS256","typ":"JWT"}.
{
"iss":"761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com",
"scope":"https://www.googleapis.com/auth/prediction",
"aud":"https://oauth2.googleapis.com/token",
"exp":1328554385,
"iat":1328550785
}.
[signature bytes]

以下は、署名されて送信の準備ができているJWTの例です。

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI3NjEzMjY3OTgwNjktcjVtbGpsbG4xcmQ0bHJiaGc3NWVmZ2lncDM2bTc4ajVAZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvcHJlZGljdGlvbiIsImF1ZCI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL29hdXRoMi92NC90b2tlbiIsImV4cCI6MTMyODU1NDM4NSwiaWF0IjoxMzI4NTUwNzg1fQ.UFUt59SUM2_AW4cRU8Y0BYVQsNTo4n7AFsNrqOpYiICDu37vVt-tw38UKzjmUKtcRsLLjrR3gFW3dNDMx_pL9DVjgVHDdYirtrCekUHOYoa1CMR66nxep5q5cBQ4y4u2kIgSvChCTc9pmLLNoIem-ruCecAJYgI9Ks7pTnW1gkOKs0x3YpiLpzplVHAkkHztaXiJdtpBcY1OXyo6jTQCa3Lk2Q3va1dPkh_d--GU2M5flgd8xNBPYw4vxyt0mP59XZlHMpztZt0soSgObf7G3GXArreF_6tpbFsS3z2t5zkEiHuWJXpzcYr5zWTRPDEHsejeBSG8EgpLDce2380ROQ

アクセストークンのリクエストを行う

署名されたJWTを生成した後、アプリケーションはそれを使用してアクセストークンを要求できます。このアクセストークン要求はHTTPSでPOSTリクエスト、およびボディはURLエンコードされています。 URLを以下に示します。

https://oauth2.googleapis.com/token

以下のパラメータはHTTPSで必要とされているPOSTリクエスト:

名前説明
grant_type :次の文字列を使用し、必要に応じてURLにエンコードされたurn:ietf:params:oauth:grant-type:jwt-bearer
assertion署名を含むJWT。

以下は、HTTPSの生のダンプであるPOSTリクエストトークンのアクセスに使用される要求は:

POST /token HTTP/1.1
Host: oauth2.googleapis.com
Content-Type: application/x-www-form-urlencoded

grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI3NjEzMjY3OTgwNjktcjVtbGpsbG4xcmQ0bHJiaGc3NWVmZ2lncDM2bTc4ajVAZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvcHJlZGljdGlvbiIsImF1ZCI6Imh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi90b2tlbiIsImV4cCI6MTMyODU3MzM4MSwiaWF0IjoxMzI4NTY5NzgxfQ.ixOUGehweEVX_UKXv5BbbwVEdcz6AYS-6uQV6fGorGKrHf3LIJnyREw9evE-gs2bmMaQI5_UbabvI4k-mQE4kBqtmSpTzxYBL1TCd7Kv5nTZoUC1CmwmWCFqT9RE6D7XSgPUh_jF1qskLa2w0rxMSjwruNKbysgRNctZPln7cqQ

以下に使用して、同じ要求であるcurl

curl -d 'grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI3NjEzMjY3OTgwNjktcjVtbGpsbG4xcmQ0bHJiaGc3NWVmZ2lncDM2bTc4ajVAZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvcHJlZGljdGlvbiIsImF1ZCI6Imh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi90b2tlbiIsImV4cCI6MTMyODU3MzM4MSwiaWF0IjoxMzI4NTY5NzgxfQ.RZVpzWygMLuL-n3GwjW1_yhQhrqDacyvaXkuf8HcJl8EtXYjGjMaW5oiM5cgAaIorrqgYlp4DPF_GuncFqg9uDZrx7pMmCZ_yHfxhSCXru3gbXrZvAIicNQZMFxrEEn4REVuq7DjkTMyCMGCY1dpMa8aWfTQFt3Eh7smLchaZsU
' https://oauth2.googleapis.com/token

応答の処理

JWTとアクセストークンのリクエストが適切に形成され、サービスアカウントに操作を実行する権限がある場合、承認サーバーからのJSON応答にはアクセストークンが含まれます。応答の例を次に示します。

{
  "access_token": "1/8xbJqaOZXSUZbHLl5EOtu1pxz3fmmetKx9W8CV4t79M",
  "scope": "https://www.googleapis.com/auth/prediction"
  "token_type": "Bearer",
  "expires_in": 3600
}

アクセストークンは、で指定された期間の窓の間に再利用することができexpires_in値。

GoogleAPIの呼び出し

Java

使用GoogleCredential次の手順を実行して、GoogleのAPIを呼び出すオブジェクトを:

  1. あなたが使用して呼び出したいことをAPIのためのサービスオブジェクトを作成しますGoogleCredentialオブジェクトを。例えば:
    SQLAdmin sqladmin =
        new SQLAdmin.Builder(httpTransport, JSON_FACTORY, credential).build();
  2. 使用したAPIサービスへの要求を行うサービスオブジェクトが提供するインタフェースを。たとえば、エキサイティング-例-123プロジェクトでのクラウドSQLデータベースのインスタンスを一覧表示する
    SQLAdmin.Instances.List instances =
        sqladmin.instances().list("exciting-example-123").execute();

Python

権限の使用Credentials次の手順を実行して、GoogleのAPIを呼び出すオブジェクト:

  1. 呼び出すAPIのサービスオブジェクトを作成します。あなたは呼び出すことにより、AAサービスオブジェクトを構築しbuild名とAPIのバージョンと許可を持つ関数Credentialsオブジェクトを。例えば、クラウドSQL管理APIのバージョン1beta3を呼び出すには:
    import googleapiclient.discovery
    
    sqladmin = googleapiclient.discovery.build('sqladmin', 'v1beta3', credentials=credentials)
  2. 使用したAPIサービスへの要求を行うサービスオブジェクトが提供するインタフェースを。たとえば、エキサイティング-例-123プロジェクトでのクラウドSQLデータベースのインスタンスを一覧表示する
    response = sqladmin.instances().list(project='exciting-example-123').execute()

HTTP / REST

アプリケーションがアクセストークンを取得した後、APIに必要なアクセス範囲が付与されている場合は、トークンを使用して、特定のサービスアカウントまたはユーザーアカウントに代わってGoogleAPIを呼び出すことができます。これを行うには、いずれかを含むことにより、APIへのリクエストにアクセストークン含むaccess_token 、クエリパラメータまたはAuthorization HTTPヘッダーBearer値。クエリ文字列はサーバーログに表示される傾向があるため、可能な場合はHTTPヘッダーを使用することをお勧めします。ほとんどの場合、あなたは、GoogleのAPIへのあなたの通話を設定するには、クライアントライブラリを使用することができます(例えば、時にドライブのファイルAPIを呼び出します)。

あなたはすべてのGoogleのAPIを試してみるとで彼らのスコープを表示することができOAuth 2.0の遊び場

HTTPGETの例

呼び出しdrive.filesエンドポイント(ドライブファイルのAPI)を使用してAuthorization: Bearer HTTPヘッダーには、次のようになります。独自のアクセストークンを指定する必要があることに注意してください。

GET /drive/v2/files HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer access_token

ここで使用して認証されたユーザーのために、同じAPIの呼び出しですaccess_token 、クエリ文字列パラメータは:

GET https://www.googleapis.com/drive/v2/files?access_token=access_token

curl

あなたがこれらのコマンドをテストすることができcurlコマンドラインアプリケーション。 HTTPヘッダーオプションを使用する例を次に示します(推奨)。

curl -H "Authorization: Bearer access_token" https://www.googleapis.com/drive/v2/files

または、代わりに、クエリ文字列パラメータオプション:

curl https://www.googleapis.com/drive/v2/files?access_token=access_token

アクセストークンの有効期限が切れたとき

アクセスは、GoogleのOAuth 2.0の認証サーバによって発行されたトークンが提供する期間後に期限切れexpires_in値。アクセストークンの有効期限が切れると、アプリケーションは別のJWTを生成して署名し、別のアクセストークンを要求する必要があります。

JWTエラーコード

errorフィールドerror_descriptionフィールド意味解決方法
unauthorized_client Unauthorized client or scope in request.ドメイン全体の委任を使用しようとしている場合、サービスアカウントはユーザーのドメインの管理コンソールで承認されていません。

サービスアカウントがで認可されていることを確認し、ドメイン全体の委任でのユーザーのための管理コンソールのページsub請求(フィールド)。

通常は数分かかりますが、承認がGoogleアカウントのすべてのユーザーに反映されるまでに最大24時間かかる場合があります。

unauthorized_client Client is unauthorized to retrieve access tokens using this method, or client not authorized for any of the scopes requested.サービスアカウントは、管理コンソールのクライアントID(数値)ではなく、クライアントの電子メールアドレスを使用して承認されました。ドメイン全体の委任管理コンソールのページ、クライアントを削除し、数値のIDでそれを再追加します。
access_denied (任意の値)ドメイン全体の委任を使用している場合、1つ以上の要求されたスコープが管理コンソールで許可されていません。

サービスアカウントがで認可されていることを確認し、ドメイン全体の委任でのユーザーのための管理コンソールのページsub請求(フィールド)、およびそれが含まれていることのすべては、あなたが要求しているスコープscopeあなたのJWTの主張。

通常は数分かかりますが、承認がGoogleアカウントのすべてのユーザーに反映されるまでに最大24時間かかる場合があります。

invalid_grant Not a valid email.ユーザーは存在しません。電子メールアドレスことを確認してくださいsub主張(フィールド)が正しいです。
invalid_grant

Invalid JWT: Token must be a short-lived token (60 minutes) and in a reasonable timeframe. Check your 'iat' and 'exp' values and use a clock with skew to account for clock differences between systems.

通常、これはローカルシステム時刻が正しくないことを意味します。場合にも起こる可能性がexp値から将来的には以上の65分であるiat値、またはexp値がより低いiat値。

JWTが生成されるシステムのクロックが正しいことを確認してください。必要であれば、とあなたの時間を同期するGoogleのNTP

invalid_grant Invalid JWT Signature.

JWTアサーションは、クライアントの電子メールで識別されるサービスアカウントに関連付けられていない秘密鍵で署名されているか、使用された鍵が削除、無効化、または期限切れになっています。

または、JWTアサーションが正しくエンコードされていない可能性があります。改行や等号のパディングを使用せずにBase64でエンコードする必要があります。

JWTクレームセットをデコードし、アサーションに署名したキーがサービスアカウントに関連付けられていることを確認します。

Googleが提供するOAuthライブラリを使用して、JWTが正しく生成されていることを確認してください。

invalid_scope Invalid OAuth scope or ID token audience provided.スコープが要求されなかった(スコープの空のリスト)か、要求されたスコープの1つが存在しません(つまり、無効です)。

ていることを確認してくださいscope JWTの請求(フィールド)が移入され、そしてエラーやタイプミスがないことを確認するために、それはあなたが使用したいAPIの文書化のスコープで含まれていることをスコープを比較します。

スコープのリストことに留意されたいscope請求ニーズがスペースではなくコンマで分離されます。

disabled_client The OAuth client was disabled. JWTアサーションの署名に使用されるキーは無効になっています。

行く Google API Console、およびIAM&管理]> [サービスアカウント]の下で、アサーションに署名するために使用される「キーID」が含まれているサービスアカウントを有効にします。

補遺:OAuthなしのサービスアカウント認証

一部のGoogleAPIでは、OAuth 2.0アクセストークンではなく、署名されたJWTをベアラートークンとして直接使用して、承認されたAPI呼び出しを行うことができます。これが可能な場合は、API呼び出しを行う前にGoogleの認証サーバーにネットワークリクエストを行う必要がなくなります。

呼び出したいAPIは、に掲載されたサービス定義されている場合は、Google APIのGitHubのリポジトリを、あなたは、JWTの代わりに、アクセストークンを使用して、許可APIの呼び出しを行うことができます。そうするために:

  1. サービスアカウントを作成し、上記のよう。アカウントを作成するときに取得したJSONファイルを必ず保持してください。
  2. このように見られるものなどの任意の標準的なJWTライブラリを使用してjwt.io 、次の例のように、ヘッダとペイロードとJWTを作成する:
    {
      "alg": "RS256",
      "typ": "JWT",
      "kid": "abcdef1234567890"
    }
    .
    {
      "iss": "123456-compute@developer.gserviceaccount.com",
      "sub": "123456-compute@developer.gserviceaccount.com",
      "aud": "https://firestore.googleapis.com/",
      "iat": 1511900000,
      "exp": 1511903600
    }
    • 以下のためにkidヘッダー内のフィールドは、サービスアカウントの秘密鍵IDを指定します。あなたには、この値を見つけることができprivate_key_idあなたのサービスアカウントJSONファイルのフィールド。
    • 以下のためにisssubフィールドは、サービスアカウントのメールアドレスを指定します。あなたには、この値を見つけることができclient_emailあなたのサービスアカウントJSONファイルのフィールド。
    • 以下のためaudフィールド、APIエンドポイントを指定します。例: https:// SERVICE .googleapis.com/
    • iatフィールド、現在のUnix時間を指定し、ためにexp JWTが期限切れになるフィールド、正確に3600秒後、時間を指定します。

サービスアカウントのJSONファイルにある秘密鍵を使用してRSA-256でJWTに署名します。

例えば:

Java

使い方グーグル-API-javaのクライアントのjava-JWTを

GoogleCredential credential =
        GoogleCredential.fromStream(new FileInputStream("MyProject-1234.json"));
PrivateKey privateKey = credential.getServiceAccountPrivateKey();
String privateKeyId = credential.getServiceAccountPrivateKeyId();

long now = System.currentTimeMillis();

try {
    Algorithm algorithm = Algorithm.RSA256(null, privateKey);
    String signedJwt = JWT.create()
        .withKeyId(privateKeyId)
        .withIssuer("123456-compute@developer.gserviceaccount.com")
        .withSubject("123456-compute@developer.gserviceaccount.com")
        .withAudience("https://firestore.googleapis.com/")
        .withIssuedAt(new Date(now))
        .withExpiresAt(new Date(now + 3600 * 1000L))
        .sign(algorithm);
} catch ...

Python

使用PyJWTを

iat = time.time()
exp = iat + 3600
payload = {'iss': '123456-compute@developer.gserviceaccount.com',
           'sub': '123456-compute@developer.gserviceaccount.com',
           'aud': 'https://firestore.googleapis.com/',
           'iat': iat,
           'exp': exp}
additional_headers = {'kid': PRIVATE_KEY_ID_FROM_JSON}
signed_jwt = jwt.encode(payload, PRIVATE_KEY_FROM_JSON, headers=additional_headers,
                       algorithm='RS256')
  1. :トークンベアラーとして署名JWTを使用して、APIを呼び出し
    GET /v1/projects/abc/databases/123/indexes HTTP/1.1
    Authorization: Bearer SIGNED_JWT
    Host: firestore.googleapis.com