Secondary User Verification

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

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

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

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

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

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

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

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

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

  • チャレンジなし - Secondary User Verification チャレンジを使用しないリクエストとレスポンス。
  • ackNeeded - 認証を必要とする 2 次的なユーザー確認 明示的な確認応答(はい / いいえ)で応答できます。また、トレイトの状態を 回答のフィードバック。このチャレンジの種類は、セキュリティ上の理由からおすすめしません サポートしています。
  • 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

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

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
          }
        }]
      }]
    }
  }]
}
<ph type="x-smartling-placeholder">
</ph>
回答 1
で確認できます。
{
  "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
  "payload": {
    "commands": [{
      "ids": ["123"],
      "status": "ERROR",
      "errorCode": "challengeNeeded",
      "challengeNeeded": {
        "type": "ackNeeded"
      }
    }]
  }
}
<ph type="x-smartling-placeholder">
</ph>
リクエスト 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
          }
        }]
      }]
    }
  }]
}
<ph type="x-smartling-placeholder">
</ph>
回答 2
{
  "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
  "payload": {
    "commands": [{
      "ids": ["123"],
      "status": "SUCCESS"
    }]
  }
}

トレイトの状態を伴う ackNeeded

ユーザーの確認応答を副次的に行う認証で、 あります。 たとえば、2024 年に TemperatureSetting トレイトと両方 thermostatModethermostatTemperatureSetpoint が設定されていると、 Assistant さんは、暖房を設定してもよろしいですか? エアコンを 28 度に?

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

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

以下の例は、トレイトの状態を使用した ackNeeded チャレンジでのリクエストとレスポンスを示しています。エアコンモードを暖房に切り替え、温度を 28 度に設定します。次に、Assistant がユーザーに確認を求めます。 暖房をオンにして温度を 28 度に設定します。 度(thermostatTemperatureSetpoint28 が州として返されるため) 返されます。

ユーザー エアコンを暖房に設定して。
Google Assistant エアコンの暖房を 28 度に設定してもよろしいですか? 度?
ユーザー はい。
Google Assistantnt エアコンの暖房を 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"
          }
        }]
      }]
    }
  }]
}
<ph type="x-smartling-placeholder">
</ph>
回答 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"
          }
        }]
      }]
    }
  }]
}
<ph type="x-smartling-placeholder">
</ph>
対応
{
  "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
          }
        }]
      }]
    }
  }]
}
<ph type="x-smartling-placeholder">
</ph>
対応
{
  "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
  "payload": {
    "commands": [{
      "ids": ["123"],
      "status": "ERROR",
      "errorCode": "challengeNeeded",
      "challengeNeeded": {
        "type": "pinNeeded"
      }
    }]
  }
}

エラー レスポンス

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

  • tooManyFailedAttempts - 失敗回数が多すぎます。 この操作を完了するには、デバイスのアプリに移動してください。
  • pinIncorrect - セキュリティ コードが正しくありません。
  • userCancelled - OK

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