Secondary User Verification

二次的なユーザー確認とは、2 つ目の要素を使って音声コマンドのセキュリティを強化する仕組みです。Secondary User Verification を使用することで、セキュリティ カメラの電源を切る、ドアを開けるといった特定のアクションのセキュリティが高まります。二次的なユーザー確認は特定のデバイス トレイトには結び付けられていないため、いつ Google Assistantにチャレンジを発行させるかはデベロッパーが決定できます。たとえば、セキュリティ カメラの OnOff トレイトではチャレンジを発行し、ライトの OnOff トレイトではチャレンジを発行しないよう設定できます。また、同じアクションでも、Assistant 特定の状況下でのみチャレンジを発行するように設定することもできます。たとえば、NFC キーフォブが近くにないドアを開ける場合はチャレンジ リクエストを発行し、キーフォブが存在するドアを開ける場合はチャレンジを発行しないよう Assistant に要求できます。

Assistant は、 明示的な確認応答と個人識別番号(PIN)の 2 種類のチャレンジを発行できます。チャレンジを発行すると、Assistant からアクションに返される QUERYEXECUTE のインテントにチャレンジ ブロックが追加され、challengeNeeded エラー レスポンスが受け入れられます。Assistant は、チャレンジ ブロックにチャレンジ データを格納したインテント リクエストを アクションに返します。このチャレンジ データを検証して、ユーザーから提供されたセキュリティ レスポンスが正しいかどうかを判断できます。

Assistant によるユーザーへのチャレンジは対話として行われますが、音声非対応のサーフェスで Assistant を使用している場合、PIN の入力と確認は画面上で行われます。

二次的なユーザー確認を使用する場合

二次的なユーザー確認 は、任意のデバイスタイプまたはトレイトで有効にできます。ただし、統合の認定を受けるには、セキュリティが重要な特定のデバイスタイプとトレイトに二次的なユーザー確認を実装する必要があります。

次のトレイトとデバイスタイプの組み合わせでは、pinNeeded チャレンジタイプを使用した二次的なユーザー確認が必要です。

  • デバイスタイプが CAMERA の場合の OnOff トレイト。
  • デバイスタイプが DOORGARAGEGATEWINDOW の場合の OpenClose トレイト。
  • ロック解除時の LockUnlock トレイト。
  • 解除時または解除のキャンセル時の ArmDisarm トレイト。
  • デバイスタイプが NETWORK または ROUTER の場合の RebootSoftwareUpdateNetworkControl トレイト。

デバイスタイプが 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 リビングの照明を暗くします。
リクエスト 1
{
  "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
          }
        }]
      }]
    }
  }]
}
レスポンス 1
{
  "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
  "payload": {
    "commands": [{
      "ids": ["123"],
      "status": "ERROR",
      "errorCode": "challengeNeeded",
      "challengeNeeded": {
        "type": "ackNeeded"
      }
    }]
  }
}
リクエスト 2
{
  "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
          }
        }]
      }]
    }
  }]
}
レスポンス 2
{
  "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
  "payload": {
    "commands": [{
      "ids": ["123"],
      "status": "SUCCESS"
    }]
  }
}

トレイトの状態を伴う ackNeeded

トレイトの状態を使用できる Secondary User Verification 認証。 たとえば、 TemperatureSetting トレイトを使用しているときに、 thermostatModethermostatTemperatureSetpoint の両方が設定されている場合、 Assistantエアコンを 28 度に設定してもよろしいですか?と尋ねます。

また、レスポンスに状態を含めて、 Assistantに指定された リクエストに基づいて特定のアクションを実行させることもできます。

以下のトレイトとその状態は、トレイトの状態を伴う ackNeeded をサポートします。特定のトレイトがリストされている場合は、そのすべての状態がサポートされています。

  • ArmDisarm
    • `ackNeeded` チャレンジタイプを使用してデバイスの監視をオンまたは監視をキャンセルしますが、監視解除機能と監視解除のキャンセル機能には `pinNeeded` チャレンジタイプが必要です。
  • Fill
  • LockUnlock
    • ackNeeded チャレンジタイプを使用してデバイスをロックし、 pinNeeded チャレンジタイプを使用してロックを解除します。
  • OnOff
    • on
    • このトレイトには ackNeeded チャレンジタイプを使用します。このトレイトを CAMERA デバイスで使用する場合は、pinNeeded チャレンジタイプが必要です。
  • OpenClose
    • このトレイトには ackNeeded チャレンジタイプを使用します。このトレイトを DOORGARAGEGATE または WINDOW デバイスで使用する場合は、pinNeeded チャレンジタイプが必要です。
  • Scene
  • TemperatureSetting
    • thermostatMode
    • thermostatTemperatureSetpoint
    • thermostatTemperatureSetpointHigh
    • thermostatTemperatureSetpointLow

以下の例は、トレイトの状態を使用する ackNeeded チャレンジのリクエストとレスポンスを示します。エアコンのモードを暖房に変更し、温度を 28 度に設定します。レスポンスで thermostatTemperatureSetpoint28 が状態として返されるため、Assistant は暖房をオンにして温度を 28 度に設定することを確認します。

ユーザー エアコンを暖房に設定して。
Google Assistant エアコンを 28 度に設定してもよろしいですか?
ユーザー はい。
Google Assistant エアコンを 28 度に設定します。
リクエスト 1
{
  "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"
          }
        }]
      }]
    }
  }]
}
レスポンス 1
{
  "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
  "payload": {
    "commands": [{
      "ids": ["123"],
      "status": "ERROR",
      "states": {
        "thermostatMode": "heat",
        "thermostatTemperatureSetpoint": 28
      },
      "errorCode": "challengeNeeded",
      "challengeNeeded": {
        "type": "ackNeeded"
      }
    }]
  }
}
リクエスト 2
{
  "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
          }
        }]
      }]
    }
  }]
}
レスポンス 2
{
  "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 - わかりました。

エラーと例外の全リストをご覧ください