アカウントを認可する

Google Cloud プロジェクトと Device Access プロジェクトを作成したら、サポートされている Google Nest デバイスで Google アカウントを SDM API 用に認可できます。

構造とデバイスを表示するには、PCM を使用して Google アカウントを Device Access プロジェクトにリンクする必要があります。 PCM を使用すると、 user は、構造とデバイスデータにアクセスする権限を に付与できます。 developer

このガイドでは、 user と developerの両方を務めます。

  1. ウェブブラウザで次のリンクを開き、次のように置き換えます。

    1. project-id は Device Access Project ID に置き換えます
    2. oauth2-client-idGoogle Cloud の認証情報の OAuth2 クライアント ID に置き換えます
    https://nestservices.google.com/partnerconnections/project-id/auth?redirect_uri=https://www.google.com&access_type=offline&prompt=consent&client_id=oauth2-client-id&response_type=code&scope=https://www.googleapis.com/auth/sdm.service
    
  2. 最近複数のアカウントで Google にログインしている場合は、Google アカウントのリストが表示された最初の [アカウントを選択] 画面が表示されることがあります。その場合は、認可するデバイスに関連付けられている Google アカウントを選択します。 Device Access
  3. [Google Nest の権限] 画面は PCM 自体です。 ここで、構造とデバイスの権限を付与できます。自宅(ステップ 1)と、SDM API でサポートされている自宅内のデバイス(ステップ 2)の権限をオンにして、[次へ] をクリックします。
  4. [プロジェクト名 にアクセスするアカウントを選択してください] 画面で、 プロジェクト名 は Google Cloud プロジェクトの名前です。SDM API の認可に使用する Google アカウントを選択します。以前と同じ Google アカウントを使用します。
  5. アカウントを選択すると、 [このアプリは Google で確認されていません] という警告画面が表示されることがあります。その場合は、 [詳細] オプションをクリックし、[プロジェクト名 に移動(安全ではありません)] をクリックして続行します。詳しくは、 このアプリは Google で確認されていませんをご覧ください。
  6. [プロジェクト名 の権限を付与] 画面で [許可] をクリックして、プロジェクトに Google アカウントへのアクセス権を付与します。
  7. [選択内容を確認] 画面で、付与する権限がオンになっていることを確認し、[許可] をクリックして確定します。
  8. https://www.google.com にリダイレクトされます。認可コードは、URL の code パラメータとして返されます。形式は次のようになります。

    https://www.google.com?code=authorization-code&scope=https://www.googleapis.com/auth/sdm.service
    
  9. 認証コードをコピーします。

アクセス トークンを取得する

認証コードを使用して、SDM API の呼び出しに使用できるアクセス トークンを取得します。

  1. ターミナルを開いて次の curl コマンドを実行し、次のように置き換えます。

    1. oauth2-client-idoauth2-client-secretGoogle Cloud の認証情報の OAuth2 クライアント ID とクライアント シークレットに置き換えます
    2. authorization-code は前のステップで受け取ったコードに置き換えます
    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=https://www.google.com'
  2. Google OAuth は、アクセス トークンと 更新トークンの 2 つのトークンを返します。

    {
      "access_token": "access-token",
      "expires_in": 3599,
      "refresh_token": "refresh-token",
      "scope": "https://www.googleapis.com/auth/sdm.service",
      "token_type": "Bearer"
    }
    両方の値をコピーします。アクセス トークンは SDM API の呼び出しに使用され、更新トークンは新しいアクセス トークンの取得に使用されます。

デバイスリストの呼び出しを行う

新しいアクセス トークンを使用して最初の devices.list 呼び出しを行うまで、認可は完了しません。この 最初の呼び出しで認可プロセスが完了し、Pub/Sub サブスクリプションをすでに設定している場合はイベントが 有効になります。

curl を使用して、devices エンドポイントの呼び出しを行います。

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

呼び出しが成功すると、 Device Access プロジェクトにリンクされているデバイスのリストが返されます。各デバイスには、使用可能な特性の一意のリストがあります。

{
  "devices": [
    {
      "name": "enterprises/project-id/devices/device-id",
      "type": "sdm.devices.types.device-type",
      "traits": { ... },
      "parentRelations": [
        {
          "parent": "enterprises/project-id/structures/structure-id/rooms/room-id",
          "displayName": "device-room-name"
        }
      ]
    }
  ]
}

更新トークンの使用方法

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

このコマンドは、使用する grant_type が異なることを除いて、アクセス トークンと同じです。

  1. ターミナルを開いて次の curl コマンドを実行し、次のように置き換えます。

    1. oauth2-client-idoauth2-client-secretGoogle Cloud の認証情報の OAuth2 クライアント ID とクライアント シークレットに置き換えます
    2. refresh-token は、最初にアクセス トークンを取得したときに受け取ったコードに置き換えます。
    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'
  2. Google OAuth は新しいアクセス トークンを返します。

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

トラブルシューティング

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

更新トークンの有効期限が切れる

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

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

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

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

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

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

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

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

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

クライアントが無効です

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

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

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

リダイレクト URI の不一致

認可中に「リダイレクト URI の不一致」というエラーが発生することがあります。認可呼び出しで使用している redirect_uri 値が、Google Cloud の [認証情報] ページに記載されている、OAuth 2.0 クライアントに設定した値と同じであることを確認してください。

アカウントの権限を変更する

プロジェクトに付与された権限を変更したり、完全に切断したりするには、PCM に移動します。 Device Access

https://nestservices.google.com/partnerconnections

このページには、アカウントに接続されているサードパーティ デベロッパー サービス(Device Access プロジェクト) がすべて表示されます。変更する プロジェクトを Device Access 選択します。次の画面で、必要に応じて権限を変更します。

認可されたサービスの特定の権限のみを取り消すには、取り消す権限を 切り替えて、戻る矢印をクリックして保存します。

**認可されたサービスを完全に切断するには**、[**Google アカウントのリンクを解除**] をクリックして、プロジェクトに付与されているアカウントのすべての権限とアクセス トークンを取り消します。

PCM に目的のサービスが表示されない場合は、まず デバイスリストの呼び出しを行う必要があります。

クイック リファレンス

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

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

1 PCM

ウェブブラウザで次のリンクを開き、次のように置き換えます。

  1. project-id は Device Access Project ID に置き換えます
  2. oauth2-client-idGoogle Cloud の認証情報の OAuth2 クライアント ID に置き換えます
https://nestservices.google.com/partnerconnections/project-id/auth?redirect_uri=https://www.google.com&access_type=offline&prompt=consent&client_id=oauth2-client-id&response_type=code&scope=https://www.googleapis.com/auth/sdm.service

2 認証コード

https://www.google.com にリダイレクトされます。認可コードは、URL の code パラメータとして返されます。形式は次のようになります。

https://www.google.com?code=authorization-code&scope=https://www.googleapis.com/auth/sdm.service

3 アクセス トークン

認証コードを使用して、SDM API の呼び出しに使用できるアクセス トークンを取得します。

ターミナルを開いて次の curl コマンドを実行し、次のように置き換えます。

  1. oauth2-client-idoauth2-client-secretGoogle Cloud の認証情報の OAuth2 クライアント ID とクライアント シークレットに置き換えます
  2. authorization-code は前のステップで受け取ったコードに置き換えます

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=https://www.google.com'

レスポンス

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

4 API 呼び出し

新しいアクセス トークンを使用して最初の devices.list 呼び出しを行うまで、認可は完了しません。この 最初の呼び出しで認可プロセスが完了し、Pub/Sub サブスクリプションをすでに設定している場合はイベントが 有効になります。

認可を完了するには、指定したスコープの 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 時間のみ有効です。アクセス トークンの有効期限が切れた場合は、更新トークンを使用して新しいトークンを取得します。

ターミナルを開いて次の curl コマンドを実行し、次のように置き換えます。

  1. oauth2-client-idoauth2-client-secretGoogle 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/sdm.service",
  "token_type": "Bearer"
}