권한

작업에서 권한을 사용하여 요청을 완료하기 위한 목적으로 사용자의 개인 정보를 요청할 수 있습니다. 예를 들어 음식 배달 작업에서 기기 위치 정보 액세스 권한을 사용하여 사용자 위치에 관한 정보를 요청할 수 있습니다.

작업에 권한을 추가하면 어시스턴트는 작업에 정보를 제공하기 위해 사용자에게 권한을 요청하기 위해 일관된 표준 인터페이스를 제공합니다.

사용 가능한 권한

작업에서 요청할 수 있는 권한은 다음과 같습니다.

  • DEVICE_PRECISE_LOCATION: 사용자의 정확한 기기 위치(좌표 및 상세 주소)를 요청합니다.
  • DEVICE_COARSE_LOCATION: 사용자의 대략적인 기기 위치(우편번호 및 도시)를 요청합니다.

권한 설정

작업의 권한을 설정하려면 장면에 새 슬롯 유형을 추가합니다. 그런 다음 요청하려는 데이터 권한의 슬롯을 구성합니다.

권한 슬롯 유형 추가

actions.type.Permission 슬롯 유형을 사용하여 사용자 정보를 가져오는 권한을 작업에 부여할 수 있습니다.

이 슬롯 유형을 구성하려면 다음 단계를 따르세요.

  1. Actions 콘솔로 이동하여 프로젝트를 선택하거나 만듭니다.
  2. 상단 메뉴에서 개발을 클릭합니다.
  3. Scenes에서 권한 흐름을 추가할 장면을 클릭합니다.
  4. 장면의 슬롯 채우기 섹션에서 +를 클릭하여 새 슬롯을 추가합니다.
  5. 유형 선택 드롭다운에서 actions.type.Permission 슬롯 유형을 선택합니다.

  6. 슬롯 이름 입력 필드에서 슬롯 이름을 지정합니다.

  7. 세션 매개변수에 결과를 쓰도록 커스텀 슬롯 값 다시 쓰기를 사용 설정합니다.

슬롯 구성

이제 슬롯 구성을 위해 부여할 컨텍스트 문자열과 권한 목록을 제공할 수 있습니다. 컨텍스트 문자열은 사용자에게 정보를 요청하는 이유의 근거이며 작업에 권한을 부여해 달라는 요청을 받은 사용자에게 표시됩니다.

다음 스크린샷과 같이 슬롯 구성 섹션에서 컨텍스트 문자열과 권한을 구성할 수 있습니다.

다음 코드 스니펫은 슬롯 구성의 예를 보여줍니다.

{
  "@type": "type.googleapis.com/google.actions.conversation.v3.PermissionValueSpec",
  "context": "Context string",
  "permissions": ["DEVICE_PRECISE_LOCATION"]
}

사용자에게 표시되는 메시지는 '$context_string, Google에서 현재 위치를 가져와야 합니다. 괜찮으신가요?"

권한 코드를 사용하여 다음 사용자 정보를 확인할 수 있습니다.

권한 설명
DEVICE_PRECISE_LOCATION 정확한 기기 위치 (좌표 및 상세 주소)
DEVICE_COARSE_LOCATION 대략적인 기기 위치 (우편번호 및 도시)

권한 결과 가져오기

다음 섹션에서는 권한 상태를 확인하고 사용자가 권한을 부여한 경우 사용자 정보를 읽는 방법을 설명합니다.

권한 상태 확인

사용자가 권한을 부여하면 결과 상태가 슬롯과 연결된 세션 매개변수에 기록됩니다.

장면의 조건에서 session.params.<slot_name>.permissionStatus 값을 확인하여 권한 상태를 확인할 수 있습니다.

권한 슬롯의 상태를 확인하려면 다음 단계를 따르세요.

  1. Actions 콘솔로 이동하여 상단 메뉴에서 Develop을 클릭합니다.
  2. Scenes에서 권한 슬롯이 포함된 장면을 클릭합니다.
  3. 장면의 Condition(조건) 섹션에서 +를 클릭하여 새 조건을 추가합니다.
  4. 다음 조건을 입력하여 권한 상태를 확인합니다. 여기서 <slot_name>은 슬롯에서 구성한 세션 매개변수의 이름입니다.

    scene.slots.status == "FINAL" && (session.params.<slot_name>.permissionStatus == "PERMISSION_GRANTED" || session.params.<slot_name>.permissionStatus == "ALREADY_GRANTED")
    

  5. 장면의 Condition(조건) 섹션에서 +를 클릭하여 새 조건을 추가합니다.

  6. 사용자가 정보 공유에 동의하지 않는 경우를 처리하려면 다음 조건을 입력합니다.

    scene.slots.status == "FINAL"
    

  7. 장면의 Condition(조건) 섹션에서 +를 클릭하여 새 조건을 추가합니다.

  8. 다음 조건을 입력하여 사용자가 이미 권한을 부여했으며 다시 요청하지 않아도 되는 경우를 처리합니다.

    "DEVICE_PRECISE_LOCATION" in user.permissions
    

사용자 정보 읽기

사용자가 권한을 부여하면 후속 요청에 사용자 정보가 제공됩니다.

아래 스니펫에서는 device.currentLocation 아래 웹훅 요청에 포함된 기기 위치 정보를 볼 수 있습니다.

JSON 요청
  {
      "handler": {
        "name": "handler"
      },
      "intent": {
        "name": "",
        "params": {
          "deviceLoc": {
            "original": "",
            "resolved": {
              "@type": "type.googleapis.com/google.actions.conversation.v3.PermissionValue",
              "permissionStatus": "PERMISSION_GRANTED",
              "grantedPermissions": [
                "DEVICE_PRECISE_LOCATION"
              ]
            }
          }
        },
        "query": "Yes"
      },
      "scene": {
        "name": "Scene",
        "slotFillingStatus": "FINAL",
        "slots": {
          "deviceLoc": {
            "mode": "REQUIRED",
            "status": "SLOT_UNSPECIFIED",
            "value": {
              "grantedPermissions": [
                "DEVICE_PRECISE_LOCATION"
              ],
              "@type": "type.googleapis.com/google.actions.conversation.v3.PermissionValue",
              "permissionStatus": "PERMISSION_GRANTED"
            },
            "updated": true
          }
        },
        "next": {
          "name": "actions.scene.END_CONVERSATION"
        }
      },
      "session": {
        "id": "session_id",
        "params": {
          "deviceLoc": {
            "grantedPermissions": [
              "DEVICE_PRECISE_LOCATION"
            ],
            "permissionStatus": "PERMISSION_GRANTED",
            "@type": "type.googleapis.com/google.actions.conversation.v3.PermissionValue"
          }
        },
        "typeOverrides": [],
        "languageCode": ""
      },
      "user": {
        "locale": "en-US",
        "params": {},
        "accountLinkingStatus": "ACCOUNT_LINKING_STATUS_UNSPECIFIED",
        "verificationStatus": "VERIFIED",
        "packageEntitlements": [],
        "permissions": [
          "DEVICE_PRECISE_LOCATION"
        ],
        "lastSeenTime": "2021-02-08T20:43:47Z"
      },
      "home": {
        "params": {}
      },
      "device": {
        "capabilities": [
          "SPEECH",
          "RICH_RESPONSE",
          "LONG_FORM_AUDIO"
        ],
        "currentLocation": {
          "coordinates": {
            "latitude": 37.422,
            "longitude": -122.084
          },
          "postalAddress": {
            "revision": 0,
            "regionCode": "US",
            "languageCode": "en",
            "postalCode": "94043",
            "sortingCode": "",
            "administrativeArea": "California",
            "locality": "Mountain View",
            "sublocality": "",
            "addressLines": ["1600 Amphitheatre Parkway"],
            "recipients": [],
            "organization": ""
          }
        }
      }
    }
    

위치 유형의 스키마에 대한 자세한 내용은 Location 참조를 확인하세요.

다음 스니펫과 같이 웹훅에서 요청에 포함된 정보에 액세스할 수 있습니다.

웹훅
  app.handle('handler', (conv) => {
    let location = conv.device.currentLocation;
    conv.add(`Your postal code is ${location.postalCode}`);
  });
    

메시지에서 권한 사용

정적 프롬프트에서 권한을 참조할 수도 있습니다. 예를 들어 기기 위치의 경우 $device.currentLocation.coordinates.*$device.currentLocation.postalAddress.*를 사용할 수 있습니다. 다음 코드 스니펫은 프롬프트에서 사용자의 도시를 참조하는 방법을 보여줍니다.

candidates:
  - first_simple:
      variants:
        - speech: >-
            There are no events scheduled tomorrow in the city of $device.currentLocation.postalAddress.locality.