Действия при неявной привязке учетной записи Google работают в симуляторе / браузере, но не на устройстве (через приложение Google Home)

Я реализовал неявный поток для действий при связывании учетной записи Google и использую Dialogflow (ранее API.AI) для определения намерений.

Полный сток работает в симуляторе устройства (от AOG). Первое намерение получает ответ «Похоже, ваша учетная запись еще не связана ...», а панель отладки включает URL-адрес для инициации связывания:

https://assistant.google.com/services/auth/handoffs/auth/start?account_name=[account]@gmail.com&provider=[project_id]_dev&scopes=email&return_url=https://www.google.com/

Если я следую этому URI в окне без кеширования:

  1. Меня перенаправляют на страницу аутентификации моего приложения
  2. Я выбираю вход с помощью своей учетной записи Google (такой же, как [account] выше)
  3. Меня перенаправляют на google.com с сообщением об успешном завершении в строке URI
  4. Симулятор теперь принимает действия через мое приложение и правильно реагирует

Однако, если я буду следовать тому же процессу, используя физический Google Home и приложение gH для Android.

  1. Устройство сообщает мне, что учетная запись еще не связана
  2. Откройте главную страницу Google и перейдите по ссылке "Ссылка на [мое приложение]".
  3. Браузер открывается на страницу аутентификации
  4. Войти как пользователь
  5. Перенаправлен на белую страницу с единственной ссылкой «Вернуться в приложение», имеющей 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)

person Jeremy Gordon    schedule 13.02.2018    source источник
comment
Такое же поведение при тестировании в приложении Google Assistant на мобильном устройстве?   -  person Nazeem    schedule 13.02.2018
comment
Можете ли вы обновить свой вопрос, включив в него URL-адрес, на который вы перенаправляетесь? (Маскировка идентификатора вашего проекта, токена доступа и состояния?)   -  person Prisoner    schedule 13.02.2018
comment
@Nazeem да. В помощнике Google на Android ссылка на ссылку приложения появляется в беседе, но после ее нажатия поток идентичен тому, что происходит с физическим устройством, и не работает точно так же.   -  person Jeremy Gordon    schedule 13.02.2018
comment
@ Заключенный сделано.   -  person Jeremy Gordon    schedule 13.02.2018
comment
Не могли бы вы поделиться своим кодом перенаправления ответа?   -  person Nazeem    schedule 14.02.2018
comment
@Nazeem так и сделал   -  person Jeremy Gordon    schedule 14.02.2018
comment
У меня такая же проблема, вы что-нибудь нашли? если да, пожалуйста, помогите. Заранее спасибо.   -  person Sourav Mondal    schedule 02.03.2020
comment
@SouravMondal Я в конечном итоге заставил его работать. См. Принятый ответ ниже.   -  person Jeremy Gordon    schedule 04.03.2020
comment
@JeremyGordon. Спасибо за ваш ответ. но сказано ли в этом решении, что эта проблема решена тем, что теперь можно завершить неявный поток привязки учетных записей вне симулятора. Как мы можем сделать поток привязки учетных записей вне симулятора? Пожалуйста помоги. Спасибо.   -  person Sourav Mondal    schedule 06.03.2020
comment
@SouravMondal Я просто выполнил инструкции по настройке неявного потока, и после того, как проблема была исправлена ​​Google (согласно моему принятому ответу), все начало работать. Если вы видите аналогичную проблему, которая сохраняется и сейчас, вам, вероятно, следует создать для нее новый вопрос.   -  person Jeremy Gordon    schedule 07.03.2020


Ответы (3)


Я могу заставить его работать через долгое время. Сначала мы должны включить веб-перехватчик, и мы сможем увидеть, как включить веб-перехватчик в документах выполнения диалогового потока. Если мы собираемся использовать Google Assistant, тогда мы должны сначала включить интеграцию с Google Assistant в интеграциях. Затем выполните шаги, указанные ниже для связывания учетной записи в действиях в Google: -

Перейдите в облачную консоль Google -> API и службы -> Учетные данные -> Идентификаторы клиента OAuth 2.0 -> Веб-клиент -> Обратите внимание на идентификатор клиента, секрет клиента оттуда -> Загрузите JSON - из json запишите идентификатор проекта, auth_uri, token_uri - > URI авторизованного перенаправления -> Белый список URL-адресов нашего приложения -> в этой фиксированной части URL-адреса используется https://oauth-redirect.googleusercontent.com/r/ и добавьте идентификатор проекта в URL -> Сохраните изменения

Действия в Google -> Настройка привязки учетной записи 1. Тип предоставления = Код авторизации 2. Информация о клиенте 1. Введите идентификатор клиента, секрет клиента, auth_uri, token_uri 2. Введите идентификатор пользователя как https://www.googleapis.com/auth и token_uri как https://www.googleapis.com/token 3. Сохраните и запустите 4. При работе с помощником Google будет отображаться ошибка, но не беспокойтесь 5. Вернитесь к привязке учетной записи раздел в настройках помощника и введите auth_uri как https://accounts.google.com/o/oauth2/auth и token_uri как https://accounts.google.com/o/oauth2/token 6. Поместите области как https://www.googleapis.com/auth/userinfo.profile и https://www.googleapis.com/auth/userinfo.email, и мы готовы к работе. 7. Сохраните изменения.

В журналах хостинг-сервера (heroku) мы можем видеть значение токена доступа, а через токен доступа мы можем получить подробную информацию об адресе электронной почты.

Добавьте токен доступа к этой ссылке "https://www.googleapis.com/oauth2/v1/userinfo?access_token= ", и мы сможем получить необходимые данные на получившейся странице json.

`accessToken = req.get("originalRequest").get("data").get("user").get("accessToken")
r = requests.get(link)
print("Email Id= " + r.json()["email"])
print("Name= " + r.json()["name"])`
person Jatin Mahajan    schedule 03.04.2018

Не уверен, какое промежуточное ПО или модули python вы используете, но

self.set_response({'redirect': redir_url}, debug=True)

похоже, устанавливает параметры для возврата неправильного ответа. Вместо этого вы должны перенаправить свой ответ на redirect_url. Например, импортируя модуль перенаправления во Flask или Django, например: from flask import redirect или from django.shortcuts import redirect, а затем перенаправляйте, например:

return redirect(redirect_url)
person Nazeem    schedule 14.02.2018
comment
Это невозможно с нашей текущей настройкой аутентификации, поскольку поток входа является клиентским (как показано в фрагменте JS в вопросе). Согласно документам неявного потока, шаг 2 - завершить процесс входа / регистрации, который в любом случае должен требовать ввода данных пользователем в приложении. Таким образом, мы не возвращаем HTTP-ответ в Google напрямую, поэтому переадресации на стороне клиента на правильный URL-адрес должно быть достаточно, верно? не https://developers.google.com/actions/identity/oauth2-implicit-flow - person Jeremy Gordon; 15.02.2018
comment
Однозначно тогда! location.replace (url) будет работать со стороны клиента. - person Nazeem; 15.02.2018
comment
Я изменил с window.location = res.redirect; на window.location.replace(res.redirect);, но они ведут себя одинаково, оба выполняют перенаправление на одну и ту же белую страницу (oauth-redirect.googleusercontent) с отображением «вернуться в приложение», но не завершают привязку учетной записи. - person Jeremy Gordon; 15.02.2018

Похоже, что Google внес изменение, которое частично решило эту проблему, поскольку теперь можно завершить неявный поток привязки учетной записи за пределами симулятора, как описано в моем вопросе.

Кажется, проблема возникла из-за нечетной обработки (на стороне AOG) случая перенаправления на стороне клиента, используемого после входа в систему с помощью кнопки входа в Google.

От Джеффа Крейга в person Jeremy Gordon    schedule 13.03.2018