계정 승인

Google Cloud 및 기기 액세스 프로젝트를 만들었으면 SDM API에 지원되는 Google Nest 기기로 Google 계정을 승인할 수 있습니다.

구조와 기기를 보려면 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에서 이 앱을 확인하지 않음이라는 경고 화면이 표시될 수 있습니다. 이 경우 계속하려면 고급 옵션을 클릭한 다음 Project Name (안전하지 않음)으로 이동을 클릭합니다. 자세한 내용은 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는 액세스 토큰과 갱신 토큰이라는 두 가지 토큰을 반환합니다.

    {
      "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"
        }
      ]
    }
  ]
}

갱신 토큰 사용 방법

SDM API의 액세스 토큰은 Google OAuth에서 반환한 expires_in 매개변수에 명시된 대로 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 인증이 완료되지 않는 한 '확인되지 않음'으로 표시됩니다. 개인용으로 Device Access 를 사용하는 경우 OAuth API 인증이 필요하지 않습니다.

승인 프로세스 중에 sdm.service 범위가 Google Cloud의 OAuth 동의 화면에 구성되지 않은 경우 'Google에서 이 앱을 확인하지 않음' 화면이 표시될 수 있습니다. 고급 옵션을 클릭한 다음 프로젝트 이름으로 이동 (안전하지 않음)을 클릭하면 이 화면을 우회할 수 있습니다.

자세한 내용은 확인되지 않은 앱 화면을 참고하세요.

잘못된 클라이언트

액세스 토큰 또는 새로고침 토큰을 가져오려고 할 때 잘못된 OAuth 2.0 클라이언트 비밀을 제공하면 '잘못된 클라이언트' 오류가 발생합니다. 액세스 및 갱신 토큰 호출에 사용 중인 client_secret 값이 Google Cloud 사용자 인증 정보 페이지에 표시된 사용 중인 OAuth 2.0 클라이언트 ID의 값과 일치하는지 확인합니다.

잘못된 요청입니다. 필수 범위가 누락되었습니다.

PCM에서 권한을 부여한 후 '필수 매개변수 누락: 범위'의 '잘못된 요청' 오류가 발생할 수 있습니다. 승인 호출에서 사용하는 scope 값이 Google Cloud 사용자 인증 정보 페이지에 있는 OAuth 2.0 클라이언트에 설정한 값과 동일한지 확인합니다.

리디렉션 URI 불일치

승인 과정에서 '리디렉션 uri 불일치' 오류가 발생할 수 있습니다. 승인 호출에서 사용하는 redirect_uri 값이 Google Cloud 사용자 인증 정보 페이지에 있는 OAuth 2.0 클라이언트에 설정한 값과 동일한지 확인합니다.

계정 권한 수정

Device Access 프로젝트에 부여된 권한을 수정하거나 완전히 연결 해제하려면 PCM으로 이동하세요.

https://nestservices.google.com/partnerconnections

이 페이지에는 계정에 연결된 모든 서드 파티 개발자 서비스 (Device Access 프로젝트)가 표시됩니다. 변경할 Device Access 프로젝트를 선택합니다. 다음 화면에서 원하는 대로 권한을 수정합니다.

승인된 서비스의 특정 권한만 취소하려면 취소하려는 권한을 전환하고 뒤로 화살표를 클릭하여 저장합니다.

승인된 서비스를 완전히 연결 해제하려면 Google 계정 연결 해제를 클릭하여 프로젝트에 계정에 대한 모든 권한과 액세스 토큰을 취소합니다.

PCM에 원하는 서비스가 표시되지 않으면 먼저 기기 목록을 호출해야 할 수 있습니다.

빠른 참조

이 참조를 사용하여user 를 승인하고 Google 계정을 연결하는 단계를 빠르게 구현하세요.

이 빠른 참조를 사용하려면 코드 샘플의 각 자리표시자 변수를 특정 통합의 값으로 수정한 후 필요에 따라 복사하여 붙여넣습니다.

PCM 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 인증 코드

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는 액세스 토큰과 갱신 토큰이라는 두 가지 토큰을 반환합니다.

요청

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 갱신 토큰

SDM API의 액세스 토큰은 Google OAuth에서 반환한 expires_in 매개변수에 명시된 대로 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"
}