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のこれらの認証情報。サービス アカウントを生成するには 生成済みの公開認証情報を表示するには、次の操作を行います。
First, create a service account:
- Open the Service accounts page.
- If prompted, select a project, or create a new one.
- Click Create service account.
- Under Service account details, type a name, ID, and description for the service account, then click Create and continue.
- Optional: Under Grant this service account access to project, select the IAM roles to grant to the service account.
- Click Continue.
- Optional: Under Grant users access to this service account, add the users or groups that are allowed to use and manage the service account.
- Click Done.
Next, create a service account key:
- Click the email address for the service account you created.
- Click the Keys tab.
- In the Add key drop-down list, select Create new key.
- 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.
<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 ドメインで次の手順を完了する必要があります。
- Google Workspace ドメインの から 管理コンソールで、[メインメニュー] に移動します。 >セキュリティ > アクセスとデータ管理 >API の制御。
- [ドメイン全体の委任] ペインで、[ドメイン全体の委任を管理] を選択します。
- [新しく追加] をクリックします。
- [クライアント ID] フィールドに、サービス アカウントのクライアント ID を入力します。詳しくは、 サービス アカウントのクライアント ID を Service accounts page。
- [OAuth スコープ(カンマ区切り)] に、使用するスコープのリストを入力します。 アクセスを許可する必要があります。たとえば、アプリケーションでドメイン全体で Google Drive API と Google Calendar API に対する完全アクセス権を持っている場合は、次のように入力します。 https://www.googleapis.com/auth/drive, https://www.googleapis.com/auth/calendar
- [承認] をクリックします。
これで、アプリケーションが 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 クライアント ライブラリ 次の操作を行います
- サービス アカウントの認証情報と 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 でアプリを開発している場合は、 アプリケーションのデフォルト認証情報 プロセスを簡素化できます。
- ドメイン全体の権限の委任
サービス アカウントにドメイン全体のアクセスを委任していて、 既存のユーザー アカウントの
with_subject
メソッドを使用して、ServiceAccountCredentials
オブジェクト。例:delegated_credentials = credentials.with_subject('user@example.org')
Credentials オブジェクトを使用して、アプリケーションで Google API を呼び出します。
HTTP/REST
クライアント ID と秘密鍵を API Console様、アプリケーションで 手順は次のとおりです。
- ヘッダー、クレームセット、 受け取ります
- Google OAuth 2.0 認可サーバーにアクセス トークンをリクエストします。
- 承認サーバーから返される JSON レスポンスを処理します。
以降のセクションでは、これらの手順を行う方法について説明します。
レスポンスにアクセス トークンが含まれている場合は、そのアクセス トークンを使用して Google API を呼び出す。(レスポンスにアクセス権が含まれていない場合、 JWT やトークン リクエストの形式が正しくないか、サービス アカウントが リクエストされたスコープにアクセスする権限がありません)。
アクセス トークンが期限切れになると、アプリケーションは別のトークンを JWT で署名し、別のアクセス トークンをリクエストします。
このセクションの残りの部分では、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 を呼び出します。
手順は次のとおりです。
- API でサービス オブジェクトを作成し、サービス
GoogleCredential
オブジェクト。次に例を示します。SQLAdmin sqladmin = new SQLAdmin.Builder(httpTransport, JSON_FACTORY, credential).build();
- API サービスにリクエストを送信するには、
インターフェースを提供します。
たとえば、エキサイティングなサンプル 123 の Cloud SQL データベースのインスタンスを一覧表示するには、
プロジェクト:
SQLAdmin.Instances.List instances = sqladmin.instances().list("exciting-example-123").execute();
Python
次の手順を完了して、承認済みの Credentials
オブジェクトを使用して Google API を呼び出します。
手順は次のとおりです。
- 呼び出す API のサービス オブジェクトを作成します。サービス オブジェクトを構築すると
build
関数を呼び出して API の名前とバージョン、 承認済みのCredentials
オブジェクト。たとえば、バージョン 1beta3 を呼び出すには、 Cloud SQL Administration API:import googleapiclient.discovery sqladmin = googleapiclient.discovery.build('sqladmin', 'v1beta3', credentials=credentials)
- 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>
ドメイン全体の委任] ページで、該当するユーザーの
通常、審査は数分で完了しますが、承認が完了するまでには最長で 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>
ドメイン全体の委任] ページで、該当するユーザーの
通常、審査は数分で完了しますが、承認が完了するまでには最長で 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 |
|
通常は、ローカル システム時刻が正しくないことを意味します。また、
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 の
|
disabled_client |
The OAuth client was disabled. |
JWT アサーションの署名に使用される鍵が無効になっています。 |
Google API Consoleに移動し、[IAM と管理者 >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 呼び出しを行うことができます。手順は次のとおりです。
- 上記の手順に沿ってサービス アカウントを作成します。必ず アカウントの作成時に取得した JSON ファイルは保持してください。
- 標準の 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-client と 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')
- 署名付き 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> クロスアカウント保護ページでユーザー アカウントを保護する をご覧ください。