次要使用者驗證

雙重使用者驗證可讓你為語音指令新增第二層安全防護機制。這樣一來,你就能為特定動作 (例如關閉安全攝影機或開門) 加強安全防護機制。輔助使用者驗證並未與特定裝置特徵綁定,因此您可以自行決定何時要讓 Google Assistant 發出驗證要求。舉例來說,您可以選擇為安全攝影機的 OnOff 特徵發出驗證問題,但不為燈具的 OnOff 特徵發出驗證問題。您也可以在特定情況下,讓 Assistant 針對相同動作發出挑戰。舉例來說,您可以要求 Assistant 在 NFC 鑰匙圈不在門附近時,發出挑戰要求來開門,但如果鑰匙圈在附近,則不發出挑戰。

Assistant 可以發出兩種驗證要求:明確的確認訊息或個人識別碼 (PIN 碼)。這會在 QUERYEXECUTE 意圖中新增挑戰區塊,這些意圖會從 Assistant 傳送回您的動作,並接受 challengeNeeded 錯誤回應。Assistant 接著會將意圖要求傳回至您的動作,並附上挑戰區塊中的挑戰資料。接著,您可以驗證挑戰資料,判斷使用者是否提供正確的安全性回應。

Assistant 會使用對話方塊發出驗證要求,但如果您在非語音介面上使用 Assistant,系統會在畫面上顯示 PIN 碼和確認訊息。

支援的裝置類型

所有裝置類型都支援雙重使用者驗證。

支援的裝置特徵

所有裝置特徵都支援雙重使用者驗證。

支援的驗證類型

系統支援的雙重使用者驗證挑戰類型如下:

  • 無驗證問題:要求和回應未使用次要使用者驗證驗證問題。
  • 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

可為特徵或簡單的確認驗證使用多個狀態的次要使用者確認驗證。

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

可用於特徵狀態的次要使用者確認驗證。舉例來說,如果您使用 TemperatureSetting 特徵,且已設定 thermostatModethermostatTemperatureSetpointAssistant 可以詢問「確定要將空調溫度設為 28 度嗎?」

您也可以在回應中加入狀態,讓 Assistant 根據指定要求執行特定動作。

下列特徵和狀態可支援使用特徵狀態的 ackNeeded。列出特定特徵表示系統支援該特徵的所有狀態。

本範例顯示要求和回應,其中包含使用特徵狀態的 ackNeeded 挑戰。將空調模式改為暖氣,並將溫度設為 28 度。接著,Assistant 會要求使用者確認是否要開啟暖氣並將溫度設為 28 度,因為回應中會以狀態的形式傳回 thermostatTemperatureSetpoint28

使用者 將空調模式設為暖氣。
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 碼的示例要求和回應:

使用者 將門解鎖。
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 - Ok

請參閱錯誤和例外狀況的完整清單。