二次的なユーザー確認とは、2 つ目の要素を使って音声コマンドのセキュリティを強化する仕組みです。Secondary User Verification を使用することで、セキュリティ カメラの電源を切る、ドアを開けるといった特定のアクションのセキュリティが高まります。二次的なユーザー確認は特定のデバイス トレイトには結び付けられていないため、いつ Google Assistantにチャレンジを発行させるかはデベロッパーが決定できます。たとえば、セキュリティ カメラの OnOff トレイトではチャレンジを発行し、ライトの OnOff トレイトではチャレンジを発行しないよう設定できます。また、同じアクションでも、Assistant 特定の状況下でのみチャレンジを発行するように設定することもできます。たとえば、NFC キーフォブが近くにないドアを開ける場合はチャレンジ リクエストを発行し、キーフォブが存在するドアを開ける場合はチャレンジを発行しないよう Assistant に要求できます。
Assistant は、
明示的な確認応答と個人識別番号(PIN)の 2 種類のチャレンジを発行できます。チャレンジを発行すると、Assistant からアクションに返される QUERY と EXECUTE のインテントにチャレンジ ブロックが追加され、challengeNeeded エラー レスポンスが受け入れられます。Assistant は、チャレンジ ブロックにチャレンジ データを格納したインテント リクエストを
アクションに返します。このチャレンジ データを検証して、ユーザーから提供されたセキュリティ レスポンスが正しいかどうかを判断できます。
Assistant によるユーザーへのチャレンジは対話として行われますが、音声非対応のサーフェスで Assistant を使用している場合、PIN の入力と確認は画面上で行われます。
二次的なユーザー確認を使用する場合
二次的なユーザー確認 は、任意のデバイスタイプまたはトレイトで有効にできます。ただし、統合の認定を受けるには、セキュリティが重要な特定のデバイスタイプとトレイトに二次的なユーザー確認を実装する必要があります。
次のトレイトとデバイスタイプの組み合わせでは、pinNeeded チャレンジタイプを使用した二次的なユーザー確認が必要です。
- デバイスタイプが
CAMERAの場合のOnOffトレイト。 - デバイスタイプが
DOOR、GARAGE、GATE、WINDOWの場合のOpenCloseトレイト。 - ロック解除時の
LockUnlockトレイト。 - 解除時または解除のキャンセル時の
ArmDisarmトレイト。 - デバイスタイプが
NETWORKまたはROUTERの場合のReboot、SoftwareUpdate、NetworkControlトレイト。
デバイスタイプが AC_UNIT で、統合が日本国内にある場合は、TemperatureSetting トレイトに ackNeeded チャレンジタイプが必要です。
サポートされているチャレンジの種類
Secondary User Verification がサポートされているチャレンジの種類は以下のとおりです。
- チャレンジなし - 二次的なユーザー確認チャレンジを使用しないリクエストとレスポンス。
- ackNeeded - 明示的な確認応答(はい / いいえ)を要求する二次的なユーザー確認。レスポンス フィードバックとしてトレイトの状態を使用することもできます。このチャレンジタイプは、セキュリティ デバイスやセキュリティ トレイトにはおすすめしません。
- pinNeeded - 個人識別番号(PIN)を要求する二次的なユーザー確認。セキュリティ デバイスやセキュリティ トレイトに最適です。
チャレンジなし
以下の例は、照明をつけるためのチャレンジなしの EXECUTE リクエストとレスポンスを示します。
| ユーザー | 照明をつけて。 |
| Google Assistant | はい、3 つの照明をつけます。 |
{ "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf", "inputs": [{ "intent": "action.devices.EXECUTE", "payload": { "commands": [{ "devices": [{ "id": "123" }], "execution": [{ "command": "action.devices.commands.OnOff", "params": { "on": true } }] }] } }] }
{ "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf", "payload": { "commands": [{ "ids": ["123"], "status": "SUCCESS", "states": { "on": true, "online": true } }] } }
ackNeeded
トレイトの複数の状態を使用できる Secondary User Verification 認証、または単純な確認応答認証。
ackNeeded チャレンジタイプには次の種類があります。
単純な ackNeeded
以下の例は、照明を暗くするために ackNeeded チャレンジを発行してその確認を得る単純なリクエストとレスポンスを示します。
| ユーザー | リビングの照明を暗くして。 |
| Google Assistant | リビングの照明を暗くします。よろしいですか? |
| ユーザー | はい。 |
| Google Assistant | リビングの照明を暗くします。 |
{ "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf", "inputs": [{ "intent": "action.devices.EXECUTE", "payload": { "commands": [{ "devices": [{ "id": "123" }], "execution": [{ "command": "action.devices.commands.BrightnessAbsolute", "params": { "brightness": 12 } }] }] } }] }
{ "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf", "payload": { "commands": [{ "ids": ["123"], "status": "ERROR", "errorCode": "challengeNeeded", "challengeNeeded": { "type": "ackNeeded" } }] } }
{ "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf", "inputs": [{ "intent": "action.devices.EXECUTE", "payload": { "commands": [{ "devices": [{ "id": "123" }], "execution": [{ "command": "action.devices.commands.BrightnessAbsolute", "params": { "brightness": 12 }, "challenge": { "ack": true } }] }] } }] }
{ "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf", "payload": { "commands": [{ "ids": ["123"], "status": "SUCCESS" }] } }
トレイトの状態を伴う ackNeeded
トレイトの状態を使用できる Secondary User Verification 認証。
たとえば、
TemperatureSetting トレイトを使用しているときに、
thermostatMode と thermostatTemperatureSetpoint の両方が設定されている場合、
Assistant は エアコンを 28 度に設定してもよろしいですか?と尋ねます。
また、レスポンスに状態を含めて、 Assistantに指定された リクエストに基づいて特定のアクションを実行させることもできます。
以下のトレイトとその状態は、トレイトの状態を伴う ackNeeded をサポートします。特定のトレイトがリストされている場合は、そのすべての状態がサポートされています。
- ArmDisarm
- `
ackNeeded` チャレンジタイプを使用してデバイスの監視をオンまたは監視をキャンセルしますが、監視解除機能と監視解除のキャンセル機能には `pinNeeded` チャレンジタイプが必要です。 - Fill
- LockUnlock
ackNeededチャレンジタイプを使用してデバイスをロックし、pinNeededチャレンジタイプを使用してロックを解除します。- OnOff
on- このトレイトには
ackNeededチャレンジタイプを使用します。このトレイトをCAMERAデバイスで使用する場合は、pinNeededチャレンジタイプが必要です。 - OpenClose
- このトレイトには
ackNeededチャレンジタイプを使用します。このトレイトをDOOR、GARAGE、GATEまたはWINDOWデバイスで使用する場合は、pinNeededチャレンジタイプが必要です。 - Scene
- TemperatureSetting
thermostatModethermostatTemperatureSetpointthermostatTemperatureSetpointHighthermostatTemperatureSetpointLow
以下の例は、トレイトの状態を使用する ackNeeded チャレンジのリクエストとレスポンスを示します。エアコンのモードを暖房に変更し、温度を 28 度に設定します。レスポンスで thermostatTemperatureSetpoint の 28 が状態として返されるため、Assistant は暖房をオンにして温度を 28 度に設定することを確認します。
| ユーザー | エアコンを暖房に設定して。 |
| Google Assistant | エアコンを 28 度に設定してもよろしいですか? |
| ユーザー | はい。 |
| Google Assistant | エアコンを 28 度に設定します。 |
{ "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf", "inputs": [{ "intent": "action.devices.EXECUTE", "payload": { "commands": [{ "devices": [{ "id": "123" }], "execution": [{ "command": "action.devices.commands.TemperatureSetting", "params": { "thermostatMode": "heat" } }] }] } }] }
{ "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf", "payload": { "commands": [{ "ids": ["123"], "status": "ERROR", "states": { "thermostatMode": "heat", "thermostatTemperatureSetpoint": 28 }, "errorCode": "challengeNeeded", "challengeNeeded": { "type": "ackNeeded" } }] } }
{ "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf", "inputs": [{ "intent": "action.devices.EXECUTE", "payload": { "commands": [{ "devices": [{ "id": "123" }], "execution": [{ "command": "action.devices.commands.TemperatureSetting", "params": { "thermostatMode": "heat" }, "challenge": { "ack": true } }] }] } }] }
{ "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf", "payload": { "commands": [{ "ids": ["123"], "status": "SUCCESS", "states": { "thermostatMode": "heat", "thermostatTemperatureSetpoint": 28 } }] } }
pinNeeded
セキュリティ デバイスには pinNeeded チャレンジを使用することをおすすめします。
以下の例は、pinNeeded チャレンジを使用した最初のリクエストとレスポンスを示します。この例では、pinNeeded チャレンジを含むレスポンスが返されるため、
Assistant は PIN を要求します。この時点で、ユーザーは正しくない PIN または有効な PIN を入力できます。
正しくない PIN が提供された場合と有効な PIN が提供された場合のリクエストとレスポンスの例:
| ユーザー | ドアを開けて。 |
| Google Assistant | セキュリティ コードを教えてください。 |
{ "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf", "inputs": [{ "intent": "action.devices.EXECUTE", "payload": { "commands": [{ "devices": [{ "id": "123" }], "execution": [{ "command": "action.devices.commands.LockUnlock", "params": { "lock": false } }] }] } }] }
{ "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf", "payload": { "commands": [{ "ids": ["123"], "status": "ERROR", "errorCode": "challengeNeeded", "challengeNeeded": { "type": "pinNeeded" } }] } }
正しくない PIN
以下の例は、challengeFailedPinNeeded チャレンジのリクエストとレスポンスを示します。このチャレンジは、最初の pinNeeded チャレンジが失敗した後に使用する必要があります。
challengeFailedPinNeeded タイプが返されると、
Assistant はセキュリティ コードを再度要求します。ユーザーが失敗を繰り返した場合は、tooManyFailedAttempts エラー レスポンスを返すことができます。エラー レスポンスをご覧ください。
| ユーザー | 333222 |
| Google Assistant | セキュリティ コードが正しくありません。 セキュリティ コードを教えてください。 |
{ "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf", "inputs": [{ "intent": "action.devices.EXECUTE", "payload": { "commands": [{ "devices": [{ "id": "123" }], "execution": [{ "command": "action.devices.commands.LockUnlock", "params": { "lock": false }, "challenge": { "pin": "333222" } }] }] } }] }
{ "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf", "payload": { "commands": [{ "ids": ["123"], "status": "ERROR", "errorCode": "challengeNeeded", "challengeNeeded": { "type": "challengeFailedPinNeeded" } }] } }
有効な PIN
以下の例は、有効な PIN が提供された場合のリクエストとレスポンスを示します。
| ユーザー | 333444 |
| Google Assistant | ドアのロックを解除します。 |
{ "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf", "inputs": [{ "intent": "action.devices.EXECUTE", "payload": { "commands": [{ "devices": [{ "id": "123" }], "execution": [{ "command": "action.devices.commands.LockUnlock", "params": { "lock": false }, "challenge": { "pin": "333444" } }] }] } }] }
{ "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf", "payload": { "commands": [{ "ids": ["123"], "status": "SUCCESS", "states": { "isLocked": false, "isJammed": false } }] } }
| ユーザー | リビングの照明を暗くして。 |
| Google Assistant | セキュリティ コードを教えてください。 |
{ "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf", "inputs": [{ "intent": "action.devices.EXECUTE", "payload": { "commands": [{ "devices": [{ "id": "123" }], "execution": [{ "command": "action.devices.commands.BrightnessAbsolute", "params": { "brightness": 12 } }] }] } }] }
{ "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf", "payload": { "commands": [{ "ids": ["123"], "status": "ERROR", "errorCode": "challengeNeeded", "challengeNeeded": { "type": "pinNeeded" } }] } }
エラー レスポンス
以下は、レスポンスで返される可能性があるエラーコードです。
- tooManyFailedAttempts - 失敗回数が多すぎます。 デバイスのアプリに移動して、そのアクションを完了してください。
- pinIncorrect - セキュリティ コードが正しくありません。
- userCancelled - わかりました。