Я реализовал неявный поток для действий при связывании учетной записи Google и использую Dialogflow (ранее API.AI) для определения намерений.
Полный сток работает в симуляторе устройства (от AOG). Первое намерение получает ответ «Похоже, ваша учетная запись еще не связана ...», а панель отладки включает URL-адрес для инициации связывания:
Если я следую этому URI в окне без кеширования:
- Меня перенаправляют на страницу аутентификации моего приложения
- Я выбираю вход с помощью своей учетной записи Google (такой же, как [account] выше)
- Меня перенаправляют на google.com с сообщением об успешном завершении в строке URI
- Симулятор теперь принимает действия через мое приложение и правильно реагирует
Однако, если я буду следовать тому же процессу, используя физический Google Home и приложение gH для Android.
- Устройство сообщает мне, что учетная запись еще не связана
- Откройте главную страницу Google и перейдите по ссылке "Ссылка на [мое приложение]".
- Браузер открывается на страницу аутентификации
- Войти как пользователь
- Перенаправлен на белую страницу с единственной ссылкой «Вернуться в приложение», имеющей href:
about:invalid@zClosurez
Связь не удалась, поэтому дополнительные попытки запустить намерение в Google Home приводят к тому же ответу «Учетная запись еще не связана».
Я подробно изучил промежуточные переменные access_token и state, и все они совпадают и выглядят правильно отформатированными:
URL аутентификации (страница входа в приложение): https://flowdash.co/auth/google?response_type=token&client_id=[client_id]&redirect_uri=https://oauth-redirect.googleusercontent.com/r/[project_id]&scope=email&state=[state]
После проверки подлинности выполняется перенаправление на (это белый экран с неработающей ссылкой "вернуться в приложение"): https://oauth-redirect.googleusercontent.com/r/genzai-app#access_token=[token]&token_type=bearer&state=[state]
Итак, похоже, есть что-то непараллельное в том, как симулятор и физические устройства работают с точки зрения неявной привязки учетных записей потоков.
Я боролся с этим, и с командой поддержки AOG очень долго безрезультатно. Кто-нибудь еще видит подобную проблему?
Обновлено с помощью кода переадресации ответа:
Вход обрабатывается компонентом response-google-login с областями профиля и электронной почты. В случае успеха мы звоним:
finish_auth(id_token) {
let provider = {
uri: '/api/auth/google_auth',
params: ['client_id', 'redirect_uri', 'state', 'response_type'],
name: "Google Assistant"
}
if (provider) {
let data = {};
provider.params.forEach((p) => {
data[p] = this.props.location.query[p];
});
if (id_token) data.id_token = id_token;
api.post(provider.uri, data, (res) => {
if (res.redirect) window.location = res.redirect;
else if (res.error) toastr.error(res.error);
});
} else {
toastr.error("Provider not found");
}
}
provider.uri попадает в эту конечную точку API:
def google_auth(self):
client_id = self.request.get('client_id')
redirect_uri = self.request.get('redirect_uri')
state = self.request.get('state')
id_token = self.request.get('id_token')
redir_url = user = None
if client_id == DF_CLIENT_ID:
# Part of Google Home / API.AI auth flow
if redirect_uri == "https://oauth-redirect.googleusercontent.com/r/%s" % secrets.GOOGLE_PROJECT_ID:
if not user:
ok, _email, name = self.validate_google_id_token(id_token)
if ok:
user = User.GetByEmail(_email, create_if_missing=True, name=name)
if user:
access_token = user.aes_access_token(client_id=DF_CLIENT_ID)
redir_url = 'https://oauth-redirect.googleusercontent.com/r/%s#' % secrets.GOOGLE_PROJECT_ID
redir_url += urllib.urlencode({
'access_token': access_token,
'token_type': 'bearer',
'state': state
})
self.success = True
else:
self.message = "Malformed"
else:
self.message = "Malformed"
self.set_response({'redirect': redir_url}, debug=True)