サーバー間アプリケーションに OAuth 2.0 を使用する

Google OAuth 2.0 システムは、ウェブ サーバー間のやり取りのようなサーバー間インタラクションを Google サービスで構成されますこのシナリオでは、サービス アカウントが必要です。 個々のエンドユーザーではなくアプリケーションに属すアカウントです。お客様の サービス アカウントに代わって Google API を呼び出すため、ユーザーは できます。このシナリオは「Two-legged OAuth」とも呼ばれます。(例: 「2LO」)。(関連する用語 「3-legged OAuth」アプリケーションがユーザーの代わりに Google API を呼び出すシナリオ (場合によってはユーザーの同意が求められるケース)

アプリケーションは通常、Google API を使用して作業する際にサービス アカウントを使用します。 ユーザーのデータではなく 独自のデータで暗号化されますたとえば、Google Cloud を使用するアプリケーションは、 データの永続性を実現する Datastore では、サービス アカウントを使用して Google Cloud Datastore API

Google Workspace ドメイン管理者は、 ユーザーにアクセスするためのドメイン全体の権限をサービス アカウントに付与する 管理できるようになります。

このドキュメントでは、アプリケーションがサーバー間の OAuth 2.0 フローを完了する方法を、 Google API クライアント ライブラリ(推奨)または HTTP を使用します。

概要

サーバー間のやり取りをサポートするには、まず API Console。ユーザーのデータにアクセスするには、 サービス アカウントにドメイン全体のアクセスを委任できます。

その後、アプリケーションはサービス アカウントの 認証情報を使用して OAuth 2.0 認証サーバーからアクセス トークンをリクエストします。

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

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

サービス アカウントの認証情報には、少なくとも 1 つの 1 つの公開鍵/秘密鍵のペアが必要です。ドメイン全体の委任が有効になっている場合は、クライアント ID も サービス アカウントの認証情報です。

アプリケーションが Google App Engine で実行されている場合、サービス アカウントが プロジェクトを作成します。

アプリケーションが Google Compute Engine で実行されている場合は、サービス アカウントも設定される 自動的に作成されますが、サービス アカウントで使用するスコープを Google Compute Engine インスタンスを作成するときに、アプリケーションがアクセスを必要とする場合があります。詳細情報 詳しくは、 サービス アカウントを使用するためのインスタンスの準備

アプリケーションが Google App Engine または Google Compute Engine で実行されていない場合は、アプリケーションを取得する必要があります。 Google API Consoleのこれらの認証情報。サービス アカウントを生成するには 生成済みの公開認証情報を表示するには、次の操作を行います。

首先,创建一个服务帐户:

  1. 打开 Service accounts page
  2. If prompted, select a project, or create a new one.
  3. 单击创建服务帐户
  4. Service account details下,键入服务帐户的名称、ID 和描述,然后点击Create and continue
  5. 可选:在Grant this service account access to project下,选择要授予服务帐户的 IAM 角色。
  6. 单击继续
  7. 可选:在Grant users access to this service account下,添加允许使用和管理服务帐户的用户或组。
  8. 单击完成

接下来,创建一个服务帐户密钥:

  1. 单击您创建的服务帐户的电子邮件地址。
  2. 单击密钥选项卡。
  3. 添加密钥下拉列表中,选择创建新密钥
  4. 单击创建

您的新公钥/私钥对已生成并下载到您的机器上;它作为私钥的唯一副本。您有责任安全地存储它。如果您丢失了这个密钥对,您将需要生成一个新的。

<ph type="x-smartling-placeholder"></ph>に戻ることができます API Console であれば、いつでもこの公開メールアドレスを表示できます。 追加の公開鍵/秘密鍵のペアを生成するために、鍵フィンガープリントやその他の情報を指定します。対象 サービス アカウントの認証情報について詳しくは、 API Consoleについては、以下をご覧ください。 API Consoleのサービス アカウント ご覧ください。

サービス アカウントのメールアドレスをメモし、サービス アカウントのメールアドレスを保存します。 アプリケーションからアクセスできる場所に置く必要があります。アプリケーションでは、 認可される API 呼び出しです。

サービス アカウントへのドメイン全体の権限の委任

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

ドメイン全体の権限をサービス アカウントに委任するには、サービス アカウントの Workspace ドメインで次の手順を完了する必要があります。

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

これで、アプリケーションが Workspace ドメイン内のユーザーとして API 呼び出しを行う "成り代わり"ユーザー)。委任された 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 Cloud Platform でアプリを開発している場合は、 アプリケーションのデフォルト認証情報 プロセスを簡素化できます。

ドメイン全体の権限の委任

ドメイン全体のアクセス権をサービス アカウントに委任していて、その権限を借用する場合 ユーザー アカウントの名前を指定します。 GoogleCredential オブジェクトの createDelegated メソッド。例:

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

上記のコードでは、GoogleCredential オブジェクトを使用して createDelegated() を呼び出します。 メソッドを呼び出します。createDelegated() メソッドの引数は、プロジェクトに属するユーザーである必要があります。 。リクエストを行うコードは、この認証情報を使用して Google サービスアカウントを使用して API にアクセスできます

Python

クライアントのメールアドレスと秘密鍵を API Consoleさん、 Python 用の Google API クライアント ライブラリ 次の操作を行います

  1. サービス アカウントの認証情報と IP アドレスから、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 Cloud Platform でアプリを開発している場合は、 アプリケーションのデフォルト認証情報 プロセスを簡素化できます。

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

    サービス アカウントにドメイン全体のアクセスを委任していて、 既存のユーザー アカウントのwith_subjectメソッドを使用して、 ServiceAccountCredentials オブジェクト。例:

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

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

HTTP/REST

クライアント ID と秘密鍵を API Console様、アプリケーションで 手順は次のとおりです。

  1. ヘッダー、クレームセット、 受け取ります
  2. Google OAuth 2.0 認可サーバーにアクセス トークンをリクエストします。
  3. 承認サーバーから返される JSON レスポンスを処理します。

以降のセクションでは、これらの手順を行う方法について説明します。

レスポンスにアクセス トークンが含まれている場合は、そのアクセス トークンを使用して Google API を呼び出す。(レスポンスにアクセス権が含まれていない場合、 JWT やトークン リクエストの形式が正しくないか、サービス アカウントが リクエストされたスコープにアクセスする権限がありません)。

アクセス トークンが期限切れになると、アプリケーションは別のトークンを JWT で署名し、別のアクセス トークンをリクエストします。

サーバー アプリケーションが JWT を使用して Google
                  認可サーバーがトークンを使用して Google API エンドポイントを呼び出します。×
                  エンドユーザーが関与します。

このセクションの残りの部分では、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 ヘッダーの構成

ヘッダーは、署名アルゴリズムを示す 3 つのフィールドからなります。 アサーション、サービス アカウントの鍵 ID、 key](https://cloud.google.com/iam/docs/reference/rest/v1/projects.serviceAccounts.keys) 署名されたトークンです。アルゴリズムと形式は必須です。各フィールドに 1 つの値です追加のアルゴリズムと形式が導入されると、このヘッダーは変更されます。 必要があります。鍵 ID は省略可能です。間違った鍵 ID を指定すると、GCP は トークンを検証し、必要に応じてトークンを拒否するために、サービス アカウントに関連付けられているすべての鍵を キーが見つかりません。Google は、誤ったキー ID を持つトークンを拒否する権限を有します。 使用できます。

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

{"alg":"RS256","typ":"JWT", "kid":"370ab79b4513eb9bad7c9bd16a95cb76b5b2a56a"}

これを Base64url で表現すると、次のようになります。

          eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsICJraWQiOiIzNzBhYjc5YjQ1MTNlYjliYWQ3YzliZDE2YTk1Y2I3NmI1YjJhNTZhIn0=
JWT クレームセットを形成する

JWT クレームセットには、JWT に関する情報( リクエスト済み(スコープ)、トークンのターゲット、発行者、トークンの発行時刻、 トークンの存続期間を指定します。ほとんどのフィールドが必須です。JWT ヘッダーと同様に、 JWT クレームセットは JSON オブジェクトであり、署名の計算に使用されます。

必須クレーム

JWT クレームセット内の必要なクレームを以下に示します。順序は問いません。 あります。

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

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 アクセスをドメイン全体の委任で制御する

リソースへのアクセスを委任されたアプリケーションにアクセス権を付与するアクセス トークンを取得するには、 ユーザーのメールアドレスを sub フィールド。

名前 説明
sub アプリケーションが委任をリクエストしているユーザーのメールアドレス できます。

アプリケーションにユーザーになりすます権限がない場合、 sub フィールドを含むアクセス トークン リクエストは、 エラーです。

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

{
  "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 Web Signature (JWS)は、Google Cloud で生成された JWT。署名の入力は、次のコンテンツのバイト配列です。

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

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

SHA256withRSA(別名 SHA256withRSA)を使用して、入力の UTF-8 表現に署名します。 SHA-256 ハッシュ関数で RSASSA-PKCS1-V1_5-SIGN)を 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 リクエストの未加工のダンプです。 request:

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 の値。

Google API の呼び出し

Java

次の手順を完了して、GoogleCredential オブジェクトを使用して Google API を呼び出します。 手順は次のとおりです。

  1. API でサービス オブジェクトを作成し、サービス GoogleCredential オブジェクト。次に例を示します。
    SQLAdmin sqladmin =
        new SQLAdmin.Builder(httpTransport, JSON_FACTORY, credential).build();
  2. API サービスにリクエストを送信するには、 インターフェースを提供します。 たとえば、エキサイティングなサンプル 123 の Cloud SQL データベースのインスタンスを一覧表示するには、 プロジェクト:
    SQLAdmin.Instances.List instances =
        sqladmin.instances().list("exciting-example-123").execute();

Python

次の手順を完了して、承認済みの Credentials オブジェクトを使用して Google API を呼び出します。 手順は次のとおりです。

  1. 呼び出す API のサービス オブジェクトを作成します。サービス オブジェクトを構築すると build 関数を呼び出して API の名前とバージョン、 承認済みの Credentials オブジェクト。たとえば、バージョン 1beta3 を呼び出すには、 Cloud SQL Administration API:
    import googleapiclient.discovery
    
    sqladmin = googleapiclient.discovery.build('sqladmin', 'v1beta3', credentials=credentials)
  2. API サービスにリクエストを送信するには、 インターフェースを提供します。 たとえば、エキサイティングなサンプル 123 の Cloud SQL データベースのインスタンスを一覧表示するには、 プロジェクト:
    response = sqladmin.instances().list(project='exciting-example-123').execute()

HTTP/REST

アプリケーションがアクセス トークンを取得したら、そのトークンを使用して Google Cloud API を呼び出すことができます。 の API を委任したり、特定のサービス アカウントの ユーザー アカウント(API に必要なアクセス スコープが付与されている場合)そのためには API へのリクエストのアクセス トークン(access_token クエリまたは パラメータまたは Authorization HTTP ヘッダー Bearer 値を指定します。可能であれば クエリ文字列はサーバーログに表示される傾向があるため、HTTP ヘッダーの使用をおすすめします。ほとんどの クライアント ライブラリを使用して Google API の呼び出しを設定できます(例: Drive Files API の呼び出しを参照)。

すべての Google API を試して、 OAuth 2.0 Playground

HTTP GET の例

呼び出しは、 <ph type="x-smartling-placeholder"></ph> drive.files エンドポイント(Drive Files API)Authorization: Bearer HTTP を使用 次のようになります。独自のアクセス トークンを指定する必要があります。

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

次に、access_token を使用して、認証されたユーザーに対して同じ API を呼び出します。 クエリ文字列パラメータ:

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. ドメイン全体の委任を使用しようとしている場合、サービス アカウントは 管理コンソールから確認できます。

Google Cloud コンソールでサービス アカウントが承認され、 <ph type="x-smartling-placeholder"></ph> ドメイン全体の委任] ページで、該当するユーザーの sub クレーム(フィールド)。

通常、審査は数分で完了しますが、承認が完了するまでには最長で 24 時間ほどかかることがあります。 Google アカウントのすべてのユーザーに適用されます。

unauthorized_client Client is unauthorized to retrieve access tokens using this method, or client not authorized for any of the scopes requested. クライアント ID ではなくクライアント メールアドレスを使用してサービス アカウントが認可された (数値)を入力します。 <ph type="x-smartling-placeholder"></ph> ドメイン全体の委任] ページを開き、クライアントを削除してから再度追加します。 数値 ID が入ります
access_denied (任意の値) ドメイン全体の委任を使用している場合、リクエストされた 1 つ以上のスコープが承認されていません 確認できます。

Google Cloud コンソールでサービス アカウントが承認され、 <ph type="x-smartling-placeholder"></ph> ドメイン全体の委任] ページで、該当するユーザーの sub クレーム(フィールド)を作成し、リクエストするすべてのスコープが含まれていることを JWT の scope クレーム内。

通常、審査は数分で完了しますが、承認が完了するまでには最長で 24 時間ほどかかることがあります。 Google アカウントのすべてのユーザーに適用されます。

admin_policy_enforced (任意の値) 次のエラーにより、Google アカウントはリクエストされた 1 つ以上のスコープを承認できません ポリシーを管理できます。

Google Workspace 管理者用ヘルプ記事をご覧ください どの第三者と 内部アプリが Google Workspace データにアクセスするをご覧ください。 管理者は、次の時点まで、すべてのスコープまたは機密性の高いスコープと制限付きスコープへのアクセスを制限できます。 OAuth クライアント ID に明示的に付与されます。

invalid_client (任意の値)

OAuth クライアントまたは JWT トークンが無効であるか、正しく構成されていません。

詳しくは、エラーの説明を参照してください。

JWT トークンが有効で、正しいクレームが含まれていることを確認します。

OAuth クライアントとサービス アカウントが 正しく設定されていること、正しいメールアドレスを使用していることを確認してください。

JWT トークンが正しく、 リクエストできます。

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 の値が、iat の値から 65 分以上先の値になっています。 または、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 つがリクエストされていません あります(無効など)。

JWT の scope クレーム(フィールド)に値が入力されていることを確認してから、比較します。 スコープと、使用する API の文書化されたスコープを使用して、 間違いや入力ミスがないことを確認します

scope クレーム内のスコープのリストは、 スペースは使用しないでください。

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

Google API Consoleに移動し、[IAM と管理者 &gt;Service Accounts で、「鍵 ID」を含むサービス アカウントを有効にします中古品 アサーションに署名します。

org_internal This client is restricted to users within its organization. リクエスト内の OAuth クライアント ID は、Google サービスへのアクセスを制限するプロジェクトの一部です 特定の <ph type="x-smartling-placeholder"></ph> Google Cloud 組織

組織のサービス アカウントを使用して認証する。以下を確認します。 ユーザーの種類 OAuth アプリケーションの構成を使用します。

追加条項: OAuth を使用しないサービス アカウントの認証

一部の Google API では、署名付き JWT をタグとして直接使用して、承認済みの API 呼び出しを行うことができます。 OAuth 2.0 アクセス トークンではなく、署名なしトークンを使用します。可能であれば Google の認証サーバーにネットワーク リクエストを行ってから、API 呼び出しを行うことができます。

呼び出す 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 フィールドに、サービス アカウントの秘密鍵を指定します。 あります。この値は、サービス アカウントの private_key_id フィールドで確認できます。 JSON ファイルです。
    • iss フィールドと sub フィールドに、サービス アカウントのメールアドレスを指定します。 あります。この値は、サービスの client_email フィールドで確認できます。 JSON 形式のファイル。
    • aud フィールドに、API エンドポイントを指定します。例: https://SERVICE.googleapis.com/
    • iat フィールドには現在の Unix 時間を指定し、 exp フィールドには、JWT が応答する 3,600 秒後の時刻を指定します。 期限が切れます。

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

例:

Java

使用 google-api-java-clientjava-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

クロスアカウント保護機能の実装

ユーザーのプライバシー保護のためにクロスアカウントの実装が Google のクロスアカウント保護サービスを利用して保護します。このサービスを使用すると、 セキュリティ・イベント通知をサブスクライブして、 ユーザー アカウントに大幅な変更が加えられる可能性があります。その後、状況に応じて、この情報を使用して 決める方法を決めることです。

Google のクロスアカウント保護サービスからアプリに送信されるイベントタイプの例を以下に示します。

  • https://schemas.openid.net/secevent/risc/event-type/sessions-revoked
  • https://schemas.openid.net/secevent/oauth/event-type/token-revoked
  • https://schemas.openid.net/secevent/risc/event-type/account-disabled

詳しくは、 <ph type="x-smartling-placeholder"></ph> クロスアカウント保護ページでユーザー アカウントを保護する をご覧ください。