承認プロセス中に、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 リンクに誘導します。
- project-id を Device Access Project ID に置き換えます
- oauth2-client-id は、Google Cloud 認証情報の OAuth2 クライアント ID に置き換えます。
- redirect-uri は、使用している OAuth2 クライアント ID に指定されたリダイレクト URI に置き換えます。
- 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 呼び出しを行い、次のように置き換えます。
- oauth2-client-id と oauth2-client-secret は、Google Cloud 認証情報の OAuth2 クライアント ID とクライアント シークレットに置き換えます。
- authorization-code は、前のステップで受け取ったコードに置き換えます。
- 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 呼び出しを行い、次のように置き換えます。
- oauth2-client-id と oauth2-client-secret は、Google Cloud 認証情報の OAuth2 クライアント ID とクライアント シークレットに置き換えます。
- 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" }