10 月 21 日の Google スマートホーム デベロッパー サミットに、ぜひオンラインでご参加ください。こちらから登録すると、Google スマートホームの新機能や最新情報を確認できます。

Secondary User Verification

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

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

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

サポートされているデバイスタイプ

Secondary User Verification はすべてのデバイスタイプでサポートされています。

サポートされているデバイス トレイト

Secondary User Verification はすべてのデバイス トレイトでサポートされています。

サポートされているチャレンジの種類

Secondary User Verification がサポートされているチャレンジの種類は以下のとおりです。

  • チャレンジなし - Secondary User Verification チャレンジを使用しないリクエストとレスポンス。
  • ackNeeded - 明示的な確認応答(はい / いいえ)を要求する Secondary User Verification。レスポンス フィードバックとしてトレイトの状態を使用することもできます。このチャレンジ タイプをセキュリティ デバイスおよびセキュリティ トレイトに使用することはおすすめしません。
  • pinNeeded - 個人識別番号(PIN)を要求する Secondary User Verification。セキュリティ デバイスやセキュリティ トレイトに最適です。

チャレンジなし

以下の例は、チャレンジを使用せずに照明を点灯させる EXECUTE リクエストとレスポンスを示します。

ユーザー 照明をつけて。
Google アシスタント はい、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

トレイトの複数の状態または単純な確認応答を使用できる二次的なユーザー認証。

ackNeeded チャレンジには次の種類があります。

単純な ackNeeded

以下の例は、照明を暗くするために ackNeeded チャレンジを発行してその確認を得る単純なリクエストとレスポンスを示します。

ユーザー リビングの照明を暗くして。
Google アシスタント リビングの照明を暗くします。よろしいですか?
ユーザー はい。
Google アシスタント リビングの照明を暗くします。
リクエスト 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

トレイトのステータスを使用できる二次的なユーザー認証。 たとえば、TemperatureSetting トレイトを使用するときに thermostatModethermostatTemperatureSetpoint の両方が設定されている場合、Google アシスタントは「エアコンの暖房を 28 度に設定してもよろしいですか?」と確認することができます。

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

以下のトレイトとそのステータスは、トレイトのステータスを伴う ackNeeded をサポートします。 トレイトだけが記載されている場合は、そのすべてのステータスがサポートされていることを示します。

以下の例は、トレイトのステータスを使用した ackNeeded チャレンジでのリクエストとレスポンスを示しています。エアコンモードを暖房に切り替え、温度を 28 度に設定します。レスポンスでステータスとして thermostatTemperatureSetpoint = 28 が返されたため、Google アシスタントは暖房をオンにして温度を 28 度に設定してよいかどうかの確認をユーザーに求めます。

ユーザー エアコンを暖房に設定して。
Google アシスタント エアコンの暖房を 28 度に設定してもよろしいですか?
ユーザー はい。
Google アシスタント エアコンの暖房を 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 チャレンジが含まれているため、Google アシスタントは PIN を要求します。この時点で、ユーザーは正しくない PIN または有効な PIN を提供する可能性があります。

正しくない PIN が提供された場合と有効な PIN が提供された場合のリクエストとレスポンスの例:

ユーザー ドアを開けて。
Google アシスタント セキュリティ コードを教えてください。
リクエスト
{
  "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 タイプが返されると、Google アシスタントはセキュリティ コードをもう一度要求します。ユーザーが何度も失敗した場合は、tooManyFailedAttempts エラー レスポンスを返すことができます。エラー レスポンスをご覧ください。

ユーザー 333222
Google アシスタント セキュリティ コードが正しくありません。 セキュリティ コードを教えてください。
リクエスト
{
  "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 アシスタント ドアのロックを解除します。
リクエスト
{
  "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 アシスタント セキュリティ コードを教えてください。
リクエスト
{
  "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"
      }
    }]
  }
}

エラー レスポンス

以下は、レスポンスで返される可能性があるエラーコードです。

  • challengeFailedNotSetup - このアクションにはセキュリティ コードが必要ですが、デバイスのアプリにセキュリティ コードが設定されていません。
  • tooManyFailedAttempts - 試行回数の上限を超えました。デバイスのアプリでそのアクションを完了してください。
  • pinIncorrect - セキュリティ コードが正しくありません。
  • userCancelled - わかりました。

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