La verificación secundaria del usuario te permite agregar un segundo factor de seguridad a los comandos por voz. Esto te permite agregar seguridad adicional para ciertas acciones, como apagar una cámara de seguridad o abrir una puerta. La verificación secundaria del usuario no está vinculada a un atributo de dispositivo específico, lo que te permite decidir cuándo hacer que Google Assistant emita un desafío. Por ejemplo, puedes elegir emitir un desafío para la característica OnOff de una cámara de seguridad, pero no emitir un desafío para la característica OnOff de una luz. También puedes hacer que Assistant emita desafíos en ciertas situaciones para la misma acción. Por ejemplo, puedes solicitar que Assistant emita una solicitud de desafío para abrir una puerta si un llavero NFC no está en la proximidad de esa puerta, pero no emitir un desafío si el llavero está presente.
El Assistant puede emitir dos tipos de desafíos:
reconocimiento explícito o número de identificación personal (PIN). Esto agrega un
bloque de desafío a los intents QUERY y EXECUTE que se envían desde Assistant de vuelta a tu acción y acepta una respuesta de error
challengeNeeded. Luego, Assistant envía la solicitud de intent a
tu acción con los datos del desafío en el bloque de desafío. Luego, puedes
validar los datos del desafío para determinar si el usuario dio la respuesta de seguridad
correcta.
Assistant usa el diálogo para emitir el desafío, pero si usas Assistant en plataformas que no son de voz, el PIN y las confirmaciones se realizan en pantalla.
Cuándo usar la verificación secundaria del usuario
Puedes habilitar la verificación secundaria del usuario para cualquier tipo de dispositivo o atributo. Sin embargo, debes implementar la verificación secundaria del usuario para ciertos tipos de dispositivos y características sensibles a la seguridad para que se certifique tu integración.
Se requiere la verificación secundaria del usuario con el tipo de desafío pinNeeded
para las siguientes combinaciones de características y tipos de dispositivos:
- El atributo
OnOffsi el tipo de dispositivo esCAMERA. - El atributo
OpenClosesi el tipo de dispositivo esDOOR,GARAGE,GATEoWINDOW. - El rasgo
LockUnlockcuando se desbloquea. - El atributo
ArmDisarmcuando se desactiva o se cancela una desactivación. - Los rasgos
Reboot,SoftwareUpdateoNetworkControlsi el tipo de dispositivo esNETWORKoROUTER.
El tipo de desafío ackNeeded es obligatorio para la característica TemperatureSetting
si el tipo de dispositivo es AC_UNIT y la integración se encuentra en Japón.
Tipos de verificación compatibles
Estos son los tipos de desafíos de verificación secundaria del usuario admitidos:
- Sin desafío: Es una solicitud y una respuesta que no usan un desafío de verificación secundaria del usuario.
- ackNeeded: Es una verificación secundaria del usuario que requiere un reconocimiento explícito (sí o no) y que también puede usar estados de rasgos como comentarios de respuesta. No se recomienda este tipo de desafío para los dispositivos y los rasgos de seguridad.
- pinNeeded: Es una verificación secundaria del usuario que requiere un número de identificación personal (PIN), que es ideal para los dispositivos y las características de seguridad.
Sin desafío
En este ejemplo, se muestra una solicitud y una respuesta de EXECUTE exitosas sin un
desafío para encender las luces.
| Usuario | Enciende las luces. |
| Google Assistant | Muy bien. Se encenderán 3 luces. |
{ "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
Es una autenticación de confirmación de usuario secundaria que puede usar varios estados para un atributo o una autenticación de confirmación simple.
Existen los siguientes tipos de desafíos de ackNeeded:
ackNeeded simple
En este ejemplo, se muestra una solicitud y una respuesta simples con un desafío de ackNeeded
para atenuar una luz y la confirmación para atenuarla.
| Usuario | Atenúa la luz de la sala de estar. |
| Google Assistant | Atenuando la luz de la sala de estar. ¿Confirmas la acción? |
| Usuario | Sí. |
| Google Assistant | Atenuando la luz de la sala de estar. |
{ "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 con estados de rasgos
Es una autenticación de confirmación de usuario secundaria que puede usar estados para un
rasgo.
Por ejemplo, si trabajas con la característica TemperatureSetting y se establecen thermostatMode y thermostatTemperatureSetpoint, Assistant puede preguntar ¿Seguro que quieres establecer la calefacción del aire acondicionado en 28 grados?
También puedes incluir un estado en una respuesta para que Assistant realice una acción específica según una solicitud determinada.
Los siguientes atributos y estados admiten ackNeeded con estados de atributos. Una lista de un atributo específico indica que se admiten todos sus estados.
- ArmDisarm
- Usa el tipo de desafío
ackNeededpara activar o cancelar la activación del dispositivo, pero para las funciones de desactivación y cancelación de la desactivación, se requiere el tipo de desafíopinNeeded. - Fill
- LockUnlock
- Usa el tipo de desafío
ackNeededpara bloquear el dispositivo y el tipo de desafíopinNeededpara desbloquearlo. - OnOff
on- Usa el tipo de desafío
ackNeededpara este atributo. El tipo de desafíopinNeededes obligatorio cuando se usa este atributo con dispositivosCAMERA. - OpenClose
- Usa el tipo de desafío
ackNeededpara este atributo. El tipo de desafíopinNeededes obligatorio cuando se usa esta característica con dispositivosDOOR,GARAGE,GATEoWINDOW. - Scene
- TemperatureSetting
thermostatModethermostatTemperatureSetpointthermostatTemperatureSetpointHighthermostatTemperatureSetpointLow
En este ejemplo, se muestra una solicitud y una respuesta con un desafío de ackNeeded que
usa un estado de rasgo. Cambia el modo del aire acondicionado a calefacción y establece la temperatura en 28 grados. Luego, Assistant les pide a los usuarios
que confirmen que se encienda la calefacción y se establezca la temperatura en 28
grados, ya que se devuelve un thermostatTemperatureSetpoint de 28 como un estado
en la respuesta.
| Usuario | Establece el modo del aire acondicionado en calor. |
| Google Assistant | ¿Confirmas que quieres establecer la calefacción del aire acondicionado en 28 grados? |
| Usuario | Sí. |
| Google Assistant | Se establecerá la calefacción del aire acondicionado en 28 grados. |
{ "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
El desafío pinNeeded se recomienda para dispositivos de seguridad.
En este ejemplo, se muestra una solicitud y una respuesta iniciales con un desafío
de pinNeeded. En el ejemplo, se devuelve una respuesta con un desafío pinNeeded, por lo que
Assistant solicita el PIN. En este punto, el usuario puede
proporcionar un PIN incorrecto o válido.
A continuación, se muestra un ejemplo de solicitud y respuesta para un PIN incorrecto o válido:
| Usuario | Destraba la puerta. |
| Google Assistant | ¿Me puedes dar tu código de seguridad? |
{ "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 incorrecto
En este ejemplo, se muestra la solicitud y la respuesta con un desafío
challengeFailedPinNeeded. Este desafío se debe usar después de que falle un desafío pinNeeded
inicial.
Cuando se devuelve un tipo challengeFailedPinNeeded,
Assistant vuelve a solicitar el código de seguridad. Si el usuario
realiza demasiados intentos fallidos, puedes devolver una respuesta de error
tooManyFailedAttempts. Consulta Respuestas de error.
| Usuario | 333222 |
| Google Assistant | Lo sentimos, el código de seguridad es incorrecto. ¿Me puedes dar tu código de seguridad? |
{ "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 válido
En este ejemplo, se muestran la solicitud y la respuesta de un PIN válido.
| Usuario | 333444 |
| Google Assistant | Destrabando la puerta. |
{ "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 } }] } }
| Usuario | Atenúa la luz de la sala de estar. |
| Google Assistant | ¿Me puedes dar tu código de seguridad? |
{ "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" } }] } }
Respuestas de error
Estos son algunos códigos de error que se pueden mostrar con tus respuestas:
- tooManyFailedAttempts: Se produjeron demasiados intentos fallidos. Ve a la app del dispositivo para completar esa acción.
- pinIncorrect: Lo sentimos, el código de seguridad es incorrecto.
- userCancelled - Ok
Consulta la lista completa de errores y excepciones.