2

Я пытаюсь настроить 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

An internal error has occurred. Dismiss

При подключении отладки консоли 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.

Так поток:

  1. Пользователь инициирует действие на дому с триггером, такими как «Эй, Google, поговорить с вексельной оплатой голосом»
  2. Поскольку пользователь не подключен к их дому служба «оплатить оплату по голосу», Home предлагает пользователю перейти в приложение Google Home и связать две учетные записи.
  3. Эта карточка появляется именно так. enter image description here
  4. Пользователь нажимает на карту, и пользовательская вкладка Chrome открывается моей страницей входа, позволяя им войти в мою службу. Эта страница реализована с помощью FirebaseUI и имеет одну кнопку, позволяющую им войти в мою службу, используя их учетную запись Google.
  5. При необходимости они выбирают учетную запись, регистрируются и перенаправляются обратно на страницу, чтобы продолжить. Именно в этот момент появляется ошибка.
  6. Если бы он работал, страница отправила бы моему внутреннему сервису информацию для входа. Это закончило бы участие FirebaseUI.На этом этапе бэкэнд-сервис свяжется с службой Firebase Auth, чтобы получить информацию об учетной записи, сформировать код авторизации для этой учетной записи и продолжить страницу потока OAuth2 и предоставить код авторизации с моей службы в Google.

Обратите внимание, что хотя (4) выполняется на вкладке Chrome, я также сказал, что он открывается в самом Chrome (через пункт меню на вкладке), и он продолжает показывать ту же проблему.

Непонятно, что именно происходит в шаге (5). Есть некоторые призывы к службе набора идентификационных данных, которые, похоже, работают до того, как они сработают с указанным вызовом.

ответ

2

Ok. Я думаю, что это то, что происходит. FirebaseUI signInWithCredential, используемый для входа в систему с помощью токенов OAuth, проверяет подтверждение под ним. Это передает токен доступа к OOuth и токен доступа к объекту Firebase Auth вместе с requestURI (текущий URL).

Проблема заключается в том, что вы пытаетесь создать собственный поставщик OAuth с использованием FirebaseUI. Протокол OAuth рекомендует, чтобы параметр состояния предоставлялся сторонним приложением (google home), а затем возвращался обратно к нему вместе с кодом Auth. Проблема заключается в том, что этот параметр состояния в вашем текущем URL-адресе отправляется в базу данных Firebase Auth в поле requestAssertion (requestUri), который затем пытается проверить его и отмечает, что он недействителен (это не предназначено для использования Firebase Auth backend в этом case), тем самым бросая ошибку «Невозможно разобрать контекст», которая возникает при несоответствии параметров состояния OAuth.

Чтобы это сработало, веб-страница, на которой размещен ваш пользовательский интерфейс входа в систему, не должна содержать параметр состояния в строке запроса.

Сейчас здесь один вариант, чтобы разблокировать вас:

  1. Главная страница Google запускает счет связывания, перенаправляет на веб-страницу со всеми ожидаемыми параметрами (redirect_uri, область применения, client_id, состояние, response_type).
  2. Сохраните их в sessionStorage и перенаправьте на другую страницу, на которой размещен FirebaseUI.
  3. Используя информацию sessionStorage, визуализируйте firebaseUI и весь дополнительный пользовательский интерфейс, и когда suer завершит поток, пользователь возвращается на страницу входа.
  4. Затем вы можете выдать код авторизации, потянуть информацию sessionStorage (redirect_uri, state) и перенаправить на redirect_uri с добавленным состоянием и кодом auth.

Резюме состоит в том, что вам необходимо убедиться, что когда пользователь перенаправляется обратно на страницу, на которой размещается ваш firebaseui после входа в систему, в строке запроса URL не указан параметр состояния. В противном случае сервер Firebase Auth предположит, что он предназначен для этого.

Проверьте вышеуказанное и сообщите мне, если это сработает. Я вернусь к вам на следующей неделе по этому вопросу.

Пожалуйста, дайте мне знать, если это не ясно, я могу объяснить, если необходимо.

+0

Я сообщил об этой ошибке команде Firebase Auth. Я буду держать вас в курсе любого обновления. – bojeil

+0

Все это имеет смысл и сработало - спасибо! Я немного изменил его, изменив параметры на не конфликтующие, вместо того, чтобы помещать их в sessionStorage, но концепция работает одинаково. – Prisoner

+0

FYI. Предстоящая версия JS Firebase должна содержать исправление для этого (ваши первоначальные изменения должны с этим работать). Еще раз спасибо за сообщение об этом. – bojeil

0

Эта ошибка обычно возникает, когда поток OAuth завершается на устройстве, которое не инициировало его из-за несоответствия параметров состояния OAuth. firebaseui не совместим с привязкой учетной записи. Можете ли вы объяснить весь свой поток, чтобы я мог понять это дальше и дать более точное объяснение?

+0

Я обновил вопрос, чтобы предоставить более подробную информацию о потоке.Имейте в виду, что FirebaseUI используется для аутентификации учетной записи, а не для передачи информации токена непосредственно в ссылку. Спасибо, что посмотрели! – Prisoner

+0

Я не уверен, как ваш поток предназначен для работы. В конце потока firebaseui, что вы планируете переходить в google home? Я думаю, что вы, как правило, возвращаете токен токена токена/токена обновления для голосовой передачи в Google, чтобы он мог войти в ваш аккаунт «оплатить оплату по голосу», не потребовав, чтобы они снова вошли в систему. Это не предусмотрено Firebase Auth. – bojeil

+0

Во всяком случае, это все еще не объясняет, почему вы получаете ошибку. Попробуем отладить это. Если вы перейдете непосредственно к вашей веб-странице firebaseUI и попробуйте войти в систему, не пропуская поток ссылок на главную страницу google. Вы получили эту ошибку? – bojeil