認証エラー

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

トラブルシューティング

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

更新トークンが繰り返し期限切れになる

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

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

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

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

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

このアプリは Google によって確認されていません

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

承認プロセス中に、「このアプリは Google で確認されていません」という画面が表示されることがあります。これは、Google Cloud の OAuth 同意画面sdm.service スコープが構成されていない場合に表示されます。この画面を省略するには、[Advanced] オプションをクリックしてから、[Go to Project Name (unsafe)] をクリックします。

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

クライアントが無効です

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

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

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

リダイレクト URI の不一致

承認中に「Redirect URI の不一致」エラーが発生することがあります。認可呼び出しで使用している redirect_uri の値は、Google Cloud の認証情報ページにある OAuth 2.0 クライアントに設定した値と同じであることを確認します。

クイック リファレンス

このリファレンスを使用すると、user を承認して Google アカウントをリンクする手順を簡単に実装できます。

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

PCM 1 回

次の要素を削除して、 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"
}