認証プロセス中に、Google OAuth がエラーを返すことがあります。このガイドでは、このプロセスで発生する最も一般的なエラーのトラブルシューティングについて説明します。
トラブルシューティング
Google OAuth の詳細については、OAuth 2.0 を使用した Google API へのアクセスをご覧ください。
更新トークンが期限切れになる
クライアント ID が承認されていない場合、更新トークンが 7 日後に機能しなくなる可能性があります。7 日間のトークンの有効期限は、商用またはサンドボックスの承認とは関係ありません。トークンの有効期間を長くするには、サービス アカウントまたはユーザー アカウントの OAuth 2.0 クライアント ID を承認して、本番環境に移行する必要があります。詳細については、更新トークンの有効期限をご覧ください。
アクセスが拒否されました
Google Cloud で OAuth 同意画面を設定し、ユーザータイプが [外部] になっている場合、アプリのテストユーザーとして登録されていない Google アカウントでアカウント リンクを試みると、「アクセスが拒否されました」というエラーが表示されます。OAuth 同意画面の [テストユーザー] セクションに Google アカウントを追加してください。
Partner Connections Manager(PCM)エラー
PCM へのアクセス時に発生したエラーについては、パートナー接続マネージャー(PCM)エラー リファレンスをご覧ください。
このアプリは Google で確認されていません
SDM API は制限付きスコープを使用します。つまり、認可時にこのスコープを使用するアプリは、OAuth API の確認が完了していない限り「未確認」になります。個人使用で Device Access を使用する場合、OAuth API の確認は必要ありません。
認証プロセス中に「Google はこのアプリを確認していません」という画面が表示されることがあります。これは、Google Cloud の OAuth 同意画面で sdm.service
スコープが構成されていない場合に表示されます。この画面は、[詳細設定] オプションをクリックしてから、[プロジェクト名(安全ではないページ)に移動] をクリックすることでバイパスできます。
詳しくは、未確認アプリの画面をご覧ください。
クライアントが無効です
アクセス トークンまたは更新トークンを取得しようとしたときに、誤った OAuth 2.0 クライアント シークレットを指定すると、「Invalid client」エラーが発生します。アクセス トークンと更新トークンの呼び出しで使用している client_secret
値が、Google Cloud の認証情報ページで確認できる、使用されている OAuth 2.0 クライアント ID の値であることを確認します。
リクエストが無効です。必要なスコープがありません
PCM で権限を付与した後、「Missing required parameter: scope」という「Invalid request」エラーが発生することがあります。認証呼び出しで使用している scope
値が、Google Cloud 認証情報ページで確認できる OAuth 2.0 クライアントに設定した値と同じであることを確認します。
リダイレクト URI の不一致
認証を行う際に、「Redirect uri mismatch(リダイレクト URI の不一致)」というエラーが発生することがあります。認証呼び出しで使用している redirect_uri
の値が、Google Cloud 認証情報ページで確認できる OAuth 2.0 クライアントに設定した値と同じであることを確認します。
クイック リファレンス
このリファレンスを使用して、user を承認して Google アカウントをリンクする手順をすばやく実装します。
このクイック リファレンスを使用するには、コードサンプルの各プレースホルダ変数を特定の統合の値で編集し、必要に応じてコピーして貼り付けます。
1 PCM
アプリの PCM リンクに user を誘導します。次の部分を置き換えます。
- 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 更新トークン
SDM API のアクセス トークンは、Google OAuth から返される expires_in
パラメータに記載されているように、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" }