Заставить пользователя повторно связать свою учетную запись

Очень простой вариант использования, объясняющий мою проблему: мое приложение запрашивает пин-код для некоторых взаимодействий. Теперь пользователь трижды дает мне неправильный пин-код. Затем я хочу сбросить его доступ и заставить его повторно привязать свою учетную запись. Я могу сделать это довольно легко в моей внутренней базе данных, но мне нужен способ сообщить Google, что его текущий токен больше не действителен. В противном случае Google Assistant отказывается отправлять мне отвергнутый токен.

Обновление 2018-03-01: с новыми встроенными намерениями / событиями я также попытался отправить событие actions_intent_SIGN_IN через атрибут followupEvent, но это только заставило помощника Google вспомнить мой API с GOOGLE_ASSISTANT_WELCOME (с старый токен oauth ..) вместо перезапуска рабочего процесса входа.


Исходное сообщение

У меня есть приложение Google Assistant с диалоговым потоком, которое заставляет пользователя войти в систему, чтобы использовать мое приложение. Начальный рабочий процесс oauth работает, и я получаю токен во всех вызовах API.

Теперь я хочу заставить пользователя повторно запустить рабочий процесс связывания учетной записи при определенных обстоятельствах. Для этого я удаляю токен oauth из своей внутренней базы данных и отправляю пользователю именно этот ответ, который должен соответствовать вызову app.askForSignIn(), если вы используете sdk: https://github.com/actions-on-google/actions-on-google-nodejs/blob/fe29016d472eeb1d080e2b575236076e9341199e/test/dialogflow-app-test.js#L1827

введите здесь описание изображения

Но это не работает. Помощник не говорит пользователю повторно запустить рабочий процесс связывания oauth и не удаляет сохраненный токен oauth. Он даже не использует токен обновления для получения нового токена доступа!

Кроме того, вместо использования атрибута «речь» в моем ответе симулятор отвечает: «Извините, я не получил никакого ответа». - хотя мой симулятор настроен на немецкий язык.

(Я также попытался исключить несколько, возможно, ненужных параметров, таких как атрибут contextOut. Это приводит к другому запросу, чем тот, который указан в официальных источниках sdk, но также не дает желаемых результатов.)


person Toni    schedule 20.11.2017    source источник
comment
Вы отправляете ответ о том, что у вас плохой токен?   -  person Nick Felker    schedule 20.11.2017
comment
@NickFelker Какой ответ мне тогда нужно отправить? Я ничего не нашел в документации (developers.google.com/actions/identity/ account-linking) по этому поводу. Единственное, что там указано, - это отправить actions.intent.SIGN_IN, чтобы запустить рабочий процесс связывания учетных записей, и это то, что я пробовал.   -  person Toni    schedule 20.11.2017
comment
Вы отправляете 400 с текстом «неверный код» или «просроченный код»? т.е. github.com/actions-on-google/actionssdk-smart-home-nodejs/blob/   -  person Nick Felker    schedule 21.11.2017
comment
@NickFelker Вы описываете ответ моей конечной точки oauth, не так ли? Проблема в том, что моя конечная точка oauth вообще не запускается повторно. Но после вашего ответа я также попытался отправить ответ 400 с «недопустимым кодом» из моего веб-перехватчика диалогового потока - это привело только к ошибке проверки в моем симуляторе действий Google. Итак, вопрос все еще таков: как мне сказать помощнику Google, чтобы он получил новый токен oauth / перезапустил привязку учетной записи?   -  person Toni    schedule 22.11.2017
comment
Что делать, если вы отправили expired code ошибку? Это должно указывать на то, что необходимо получить новый токен OAuth, и он должен отправить токен обновления.   -  person Nick Felker    schedule 22.11.2017
comment
@NickFelker Значит, вы имеете в виду отправку http 400 с телом expired code в Dialogflow? Это тоже не помогло, веб-симулятор снова выдал мне ошибку проверки. На самом деле, любой другой результат удивил бы меня: зачем диалогу потоку заботиться о моем токене oauth? Разве мне не пришлось бы вместо этого помещать что-нибудь в хэш data: { google: {} }, как я пробовал это выше с actions.intent.SIGN_IN?   -  person Toni    schedule 23.11.2017
comment
Мои отзывы больше касаются наличия работающего сервера oauth. Я менее уверен, почему он не будет работать с привязкой учетной записи в Dialogflow   -  person Nick Felker    schedule 23.11.2017
comment
@NickFelker Моя конечная точка oauth работает. Обновления токенов и т. Д. Работают, если срок действия токена истек. Весь вопрос в том, как заставить Google Assistant (через диалог) перезапустить привязку учетной записи / захват нового токена до того, как токен истечет в обычном порядке. Например, если мое приложение подозревает, что личность моего клиента была украдена из-за того, как он или она взаимодействует с приложением. В этом случае я хочу заставить пользователя немедленно повторно привязать свою учетную запись. Но как?!   -  person Toni    schedule 23.11.2017
comment
@NickFelker Например: мое приложение запрашивает пин-код для некоторых взаимодействий. Теперь пользователь трижды дает мне неправильный пин-код. Затем я хочу сбросить его доступ и заставить его повторно привязать свою учетную запись. Я могу сделать это довольно легко в моей внутренней базе данных, но мне нужен способ сообщить Google, что его текущий токен больше не действителен. В противном случае Google Assistant отказывается отправлять мне теперь отвергнутый токен.   -  person Toni    schedule 23.11.2017
comment
Это интересный вариант использования. К сожалению, я не уверен в ответе.   -  person Nick Felker    schedule 28.11.2017
comment
@NickFelker Есть какие-нибудь планы, когда это будет доступно? Это не проблема для Alexa, и imho не должно быть проблемой для любого приложения voice / oauth.   -  person Toni    schedule 31.01.2018


Ответы (2)


Решая ту же проблему, мне посоветовали отправить ответ 401, если вы хотите удалить сохраненный токен DF. DF не имеет неявного намерения отозвать токен.

person Bill McCracken    schedule 05.04.2018
comment
Ура, похоже, теперь это работает! :-) Но в ноябре 2017 года у нас не получилось. - person Toni; 03.05.2019

К сожалению, Dialogflow не сбрасывает токен с ответом об ошибке со статусом 401.

Google предоставляет API для отмены доступа и обновления токенов.
Для этого вам необходимо отправить следующий запрос
https://accounts.google.com/o/oauth2/revoke?token={token}.

См. различные реализации

РЕДАКТИРОВАТЬ: кажется, вам нужно только сбросить состояние Dialogflow. Просто приступайте к созданию редакции на консоли Dialogflow, которая, кажется, очищает токен доступа.

person Yann D.    schedule 11.04.2018
comment
Я попытался отозвать свой токен доступа, используя это, и продолжаю получать ответ invalid_token. Я предоставляю свой accessToken так, как он доступен в conv json (через conv.user.raw.accessToken). Что я делаю неправильно? - person ofekp; 22.06.2019