Для платформы, на которой я сейчас работаю, мой работодатель решил передать аутентификацию на аутсорсинг Auth0 .
Нам удалось заставить работать потоки входа и выхода, открыв хостинг страница на Auth0 и перенаправление на нашу платформу после успешного входа в систему / выхода из системы.
При успешном входе в систему с помощью адреса электронной почты и пароля Auth0 возвращает ответ в следующем формате:
{
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IlEwWTFRemREUlRW...",
"expires_in": "86400",
"id_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IlEwWTFRemREUlRWRk9V...",
"scope": "openid email",
"state": "my-custom-state",
"token_type": "Bearer"
}
Согласно официальная документация Auth0 , Auth0 допускает два способа обновления существующего токена авторизации:
- запросы аутентификации без вывода сообщений, для токенов, которые еще не истекли
- режим без вывода сообщений запрос токена в скрытом iframe для токенов с истекшим сроком действия
тихие запросы аутентификации
В документации сказано, что мне следует получить запрос на следующий URL:
https://████████████████████/authorize
?response_type=id_token token&
client_id=...&
redirect_uri=...&
state=...&
scope=openid...&
nonce=...&
audience=...&
response_mode=...&
prompt=none
Когда я открываю этот URL на любой вкладке моего браузера, я действительно правильно перенаправлен на redirect_uri
, если указан этот redirect_uri
в конфиге Auth0. И новый токен добавляется в url
после #
.
. Однако я не могу заставить его работать с XHR, ни из бэкэнда (Node.js / Nuxt), ни из внешний интерфейс (Vue / Nuxt). Когда я пытаюсь сделать это из внешнего интерфейса, мой браузер жалуется, что этот ресурс не установил заголовки CORS. Когда я пытаюсь сделать это из бэкэнда, я не могу найти способ передать свои учетные данные в URL.
Обновление токенов с истекшим сроком действия
Я не могу найти примеры кода демонстраций о том, как обновить просроченные токены без использования библиотеки auth0. js , которую я бы предпочел не использовать, если это возможно.
И когда я пытаюсь использовать их демо для библиотеку auth0. js после ее локальной установки, я даже не могу заставить работать простой логин после заполнения всех этих полей:
Это ошибка, которую я получаю:
{
"original": {
"error": "request_error",
"error_description": "{\"crossDomain\":true,\"method\":\"POST\",\"url\":\"https://████████████████████/co/authenticate\"}"
},
"code": "request_error",
"description": "{\"crossDomain\":true,\"method\":\"POST\",\"url\":\"https://████████████████████/co/authenticate\"}",
"error": "request_error",
"error_description": "{\"crossDomain\":true,\"method\":\"POST\",\"url\":\"https://████████████████████/co/authenticate\"}"
}
Может кто-нибудь помочь мне выяснить, как правильно реализовать refre sh в blackground, либо с истекшим током Auth с истекшим сроком действия?
ОБНОВЛЕНИЕ
Мне удалось продвинуться еще на один шаг, путем ...
- портирования
SilentAuthenticationHandler
из Auth0.js
в мой проект - Закомментируйте одну строку в
SilentAuthenticationHandler
, чтобы браузер не волновался, если конечная точка /authorize
находится в другом домене. n - Создание экземпляра
SilentAuthenticationHandler
с URL-адресом, который имеет response_mode
web_message
и значением для postMessageOrigin
, которое соответствует моему audience
- вызову
login
метод SilentAuthenticationHandler, with
usePostMessage set to
true , to open the
/ authorize` конечной точки в скрытом iframe - Анализ ha sh в URL-адресе страницы
callback
, переданной как redirect_uri
, а затем используя Window.parent.postMessage(parsedParams, '*')
, чтобы отправить его обратно в главное окно
После выполнения всех этих 5 шагов я наконец-то получил свой новый токен доступа и токен id.
К сожалению, я не могу не могу понять, как обновить мой Nuxt с этими новыми учетными данными. Я искал вдохновение в пакете @nuxtjs/auth
, но лучшее, что я мог придумать, это что-то вроде этого:
this.$auth.setUserToken(token);
Я пытался объединить это с, например. fetchUser
& setUser
, но независимо от того, что я пытаюсь, он продолжает *** сеанс и вызывает ошибку 400
при перезагрузке.
Что я делаю не так?