Я пытаюсь настроить account linking на действие Google Home. Чтобы аутентифицировать пользователя при входе в систему для подключения, я использую Firebase Auth и FirebaseUI-web с провайдером входа в систему Google. Страница и код-поток validates при использовании игровой площадки Google OAUth2 и когда я test account linking using the Google Home emulator, оба из которых я тестировал с помощью настольного Chrome. Но когда я иду, чтобы проверить с Google Home device and app, он запускает поток и показывает кнопку входа в систему, позволяет мне выбрать учетную запись, перенаправляет обратно на мою страницу, а затем генерирует ошибку:Ошибка «Невозможно разобрать контекст» с помощью firebaseui-web с помощью Google Home
При подключении отладки консоли Chrome к нему, у меня есть следующее сообщение об ошибке в консоли:
[ 1.995s] [firebaseui] Internal error: {"error":{"errors":[{"domain":"global","reason":"invalid","message":"Cannot parse context"}],"code":400,"message":"Cannot parse context"}}
Если я смотрю на журнал сети, последний POST XHR возвращает ошибку 400. (Некоторая информация отредактирована, так как я не знаю, что чувствительность пересылаемых данных.)
Запрос:
URL:https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyAssertion?key=[redacted]
Method:POST
заголовков запроса:
Content-Type:application/json
Origin:https://redacted.example.com
Referer:https://redacted.example.com/auth?response_type=code&client_id=api-ai-test&redirect_uri=https://oauth-redirect.googleusercontent.com/r/redacted-project&scope=test1&state=redacted
User-Agent:Mozilla/5.0 (Linux; Android 6.0.1; A0001 Build/MHC19Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.91 Mobile Safari/537.36
X-Client-Version:Chrome/JsCore/3.6.5
тела:
{
"postBody": "id_token=redacted&access_token=re.dacted&providerId=google.com",
"requestUri": "https://redacted.example.com/auth?response_type=code&client_id=api-ai-test&redirect_uri=https://oauth-redirect.googleusercontent.com/r/redacted-project&scope=test1&state=redacted",
"returnIdpCredential": true,
"returnSecureToken":true
}
Код ответа HTTP 400 с телом:
{
"error": {
"errors": [
{
"domain": "global",
"reason": "invalid",
"message": "Cannot parse context"
}
],
"code": 400,
"message": "Cannot parse context"
}
}
Есть ли способ заставить это работать правильно? Что вызывает проблему?
Update, чтобы лучше объяснить пользователю потока
Важно понимать, что FirebaseUI используется для аутентификации пользователя при входе в моей службы oauth2. Не получать информацию OAuth для непосредственного предоставления Home.
Так поток:
- Пользователь инициирует действие на дому с триггером, такими как «Эй, Google, поговорить с вексельной оплатой голосом»
- Поскольку пользователь не подключен к их дому служба «оплатить оплату по голосу», Home предлагает пользователю перейти в приложение Google Home и связать две учетные записи.
- Эта карточка появляется именно так.
- Пользователь нажимает на карту, и пользовательская вкладка Chrome открывается моей страницей входа, позволяя им войти в мою службу. Эта страница реализована с помощью FirebaseUI и имеет одну кнопку, позволяющую им войти в мою службу, используя их учетную запись Google.
- При необходимости они выбирают учетную запись, регистрируются и перенаправляются обратно на страницу, чтобы продолжить. Именно в этот момент появляется ошибка.
- Если бы он работал, страница отправила бы моему внутреннему сервису информацию для входа. Это закончило бы участие FirebaseUI.На этом этапе бэкэнд-сервис свяжется с службой Firebase Auth, чтобы получить информацию об учетной записи, сформировать код авторизации для этой учетной записи и продолжить страницу потока OAuth2 и предоставить код авторизации с моей службы в Google.
Обратите внимание, что хотя (4) выполняется на вкладке Chrome, я также сказал, что он открывается в самом Chrome (через пункт меню на вкладке), и он продолжает показывать ту же проблему.
Непонятно, что именно происходит в шаге (5). Есть некоторые призывы к службе набора идентификационных данных, которые, похоже, работают до того, как они сработают с указанным вызовом.
Я сообщил об этой ошибке команде Firebase Auth. Я буду держать вас в курсе любого обновления. – bojeil
Все это имеет смысл и сработало - спасибо! Я немного изменил его, изменив параметры на не конфликтующие, вместо того, чтобы помещать их в sessionStorage, но концепция работает одинаково. – Prisoner
FYI. Предстоящая версия JS Firebase должна содержать исправление для этого (ваши первоначальные изменения должны с этим работать). Еще раз спасибо за сообщение об этом. – bojeil