認証エラー

承認プロセス中に、Google OAuth からエラーが返されることがあります。このガイドでは、このプロセス中に発生する最も一般的なエラーのトラブルシューティングについて説明します。

トラブルシューティング

Google OAuth の詳細については、OAuth 2.0 を使用した Google API へのアクセスをご覧ください。

更新トークンが期限切れになる

クライアント ID が承認されないことが原因で、更新トークンが 7 日後に機能しなくなることがあります。7 日間のトークンの有効期限は、商用または Sandbox の承認とは関係ありません。トークンの有効期間を延長するには、サービス アカウントまたはユーザー アカウントの OAuth 2.0 クライアント ID を承認し、本番環境に導入する必要があります。詳細については、更新トークンの有効期限をご覧ください。

アクセスが拒否されました

Google Cloud で OAuth 同意画面を設定し、ユーザータイプ外部の場合、アプリのテストユーザーとしてリストにない Google アカウントでアカウント リンクを試みると、「アクセスが拒否されました」というエラーが表示されます。Google アカウントは、OAuth 同意画面の [テストユーザー] セクションに追加してください。

パートナー コネクション マネージャー(PCM)エラー

PCM へのアクセス時に発生したエラーについては、パートナー コネクション マネージャー(PCM)のエラー リファレンスをご覧ください。

このアプリはまだ確認されていません

SDM API は制限付きスコープを使用します。つまり、認可中にこのスコープを使用するアプリは、OAuth API の確認が完了しない限り、「未確認」になります。個人で使用する場合は、OAuth API の確認は必要ありません。 Device Access

承認プロセス中に「Google はこのアプリを確認していません」という画面が表示されることがあります。これは、Google Cloud の OAuth 同意画面sdm.service スコープが構成されていない場合に表示されます。この画面をバイパスするには、[詳細設定] オプションをクリックし、[プロジェクト名(安全ではない)に移動] をクリックします。

詳しくは、未確認のアプリ画面をご覧ください。

クライアントが無効です

アクセス トークンまたは更新トークンを取得する際に、指定した OAuth 2.0 クライアント シークレットが正しくないと、「無効なクライアント」というエラーが表示されます。アクセス トークンと更新トークンの呼び出しに使用している client_secret 値が、Google Cloud 認証情報ページに記載されている OAuth 2.0 クライアント ID のものであることを確認します。

無効なリクエストです。必須のスコープがありません

PCM で権限を付与した後、「必須パラメータが不足しています: scope」という「無効なリクエスト」エラーが発生することがあります。認証呼び出しで使用する scope 値が、OAuth 2.0 クライアントに設定した値と同じ(Google Cloud 認証情報ページを参照)であることを確認します。

リダイレクト URI の不一致

認証を行うと、「Redirect uri mismatch(リダイレクト URI の不一致)」というエラーが発生することがあります。認可呼び出しで使用している redirect_uri 値が、Google Cloud 認証情報ページで確認できる OAuth 2.0 クライアントに設定した値と一致していることを確認します。

クイック リファレンス

このリファレンスを使用して、user を承認し、Google アカウントをリンクする手順をすばやく実装します。

このクイック リファレンスを使用するには、コードサンプルの各プレースホルダ変数を、特定の統合の値に編集し、必要に応じてコピーして貼り付けます。

1 PCM

user をアプリの PCM リンクに誘導します。次のように置き換えます。

  1. project-id は、 Device Access Project ID に置き換えます。
  2. oauth2-client-id は、Google Cloud 認証情報の OAuth2 クライアント ID に置き換えます。
  3. redirect-uri は、使用している OAuth2 クライアント ID に指定されたリダイレクト URI に置き換えます。
  4. scope は、使用可能なスコープのいずれかに置き換えます。
https://nestservices.google.com/partnerconnections/project-id/auth?redirect_uri=redirect-uri&access_type=offline&prompt=consent&client_id=oauth2-client-id&response_type=code&scope=https://www.googleapis.com/auth/scope

2 認証コード

選択したスコープに対して PCM で権限を付与すると、 user は指定したリダイレクト URI にリダイレクトされます。認証コードは URL の code パラメータとして返されます。次の形式にする必要があります。

redirect-uri?code=authorization-code&scope=https://www.googleapis.com/auth/scope

3 アクセス トークン

認証コードを使用してアクセス トークンを取得します。このトークンによって、ユーザーの代わりに SDM API を呼び出すことができます。

Google の OAuth エンドポイントに対して POST 呼び出しを行います。次のように置き換えます。

  1. oauth2-client-idoauth2-client-secret は、Google Cloud 認証情報の OAuth2 クライアント ID とクライアント シークレットに置き換えます。
  2. authorization-code は、前の手順で受け取ったコードに置き換えます。
  3. redirect-uri は、使用している OAuth2 クライアント ID に指定されたリダイレクト URI に置き換えます。

Google OAuth は、アクセス トークンと更新トークンの 2 つのトークンを返します。

リクエスト

curl -L -X POST 'https://www.googleapis.com/oauth2/v4/token?client_id=oauth2-client-id&client_secret=oauth2-client-secret&code=authorization-code&grant_type=authorization_code&redirect_uri=redirect-uri'

レスポンス

{
  "access_token": "access-token",
  "expires_in": 3599,
  "refresh_token": "refresh-token",
  "scope": "https://www.googleapis.com/auth/scope",
  "token_type": "Bearer"
}

4 API 呼び出し

userのアクセス トークンを使用して API 呼び出しを行うまで、認可は完了しません。この最初の呼び出しにより、認可プロセスが完了し、イベントが有効になります。

指定されたスコープにリストされている API 呼び出しのいずれかを使用して、認可を完了する必要があります。

sdm.service

デバイス

詳しくは、devices.list API リファレンスをご覧ください。

curl -X GET 'https://smartdevicemanagement.googleapis.com/v1/enterprises/project-id/devices' \
    -H 'Content-Type: application/json' \
    -H 'Authorization: Bearer access-token'

5 更新トークン

Google OAuth から返される expires_in パラメータに記載されているように、SDM API のアクセス トークンの有効期間は 1 時間のみです。アクセス トークンの有効期限が切れた場合は、更新トークンを使用して新しいトークンを取得します。

Google の OAuth エンドポイントに対して POST 呼び出しを行います。次のように置き換えます。

  1. oauth2-client-idoauth2-client-secret は、Google Cloud 認証情報の OAuth2 クライアント ID とクライアント シークレットに置き換えます。
  2. refresh-token は、アクセス トークンを最初に取得したときに受け取ったコードに置き換えます。

Google OAuth から新しいアクセス トークンが返されます。

リクエスト

curl -L -X POST 'https://www.googleapis.com/oauth2/v4/token?client_id=oauth2-client-id&client_secret=oauth2-client-secret&refresh_token=refresh-token&grant_type=refresh_token'

レスポンス

{
  "access_token": "new-access-token",
  "expires_in": 3599,
  "scope": "https://www.googleapis.com/auth/scope",
  "token_type": "Bearer"
}