Как обновить токен авторизации в фоновом режиме с Auth0 в Nuxt - PullRequest
1 голос
/ 13 февраля 2020

Для платформы, на которой я сейчас работаю, мой работодатель решил передать аутентификацию на аутсорсинг 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 после ее локальной установки, я даже не могу заставить работать простой логин после заполнения всех этих полей:

enter image description here

Это ошибка, которую я получаю:

{
  "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 с истекшим сроком действия?


ОБНОВЛЕНИЕ

Мне удалось продвинуться еще на один шаг, путем ...

  1. портирования SilentAuthenticationHandler из Auth0.js в мой проект
  2. Закомментируйте одну строку в SilentAuthenticationHandler, чтобы браузер не волновался, если конечная точка /authorize находится в другом домене. n
  3. Создание экземпляра SilentAuthenticationHandler с URL-адресом, который имеет response_mode web_message и значением для postMessageOrigin, которое соответствует моему audience
  4. вызову login метод SilentAuthenticationHandler, with usePostMessage set to true , to open the / authorize` конечной точки в скрытом iframe
  5. Анализ ha sh в URL-адресе страницы callback, переданной как redirect_uri, а затем используя Window.parent.postMessage(parsedParams, '*'), чтобы отправить его обратно в главное окно

После выполнения всех этих 5 шагов я наконец-то получил свой новый токен доступа и токен id.

К сожалению, я не могу не могу понять, как обновить мой Nuxt с этими новыми учетными данными. Я искал вдохновение в пакете @nuxtjs/auth, но лучшее, что я мог придумать, это что-то вроде этого:

this.$auth.setUserToken(token);

Я пытался объединить это с, например. fetchUser & setUser, но независимо от того, что я пытаюсь, он продолжает *** сеанс и вызывает ошибку 400 при перезагрузке.

Что я делаю не так?

Ответы [ 2 ]

3 голосов
/ 13 февраля 2020

Это необходимо сделать с помощью веб-перенаправления, поскольку серверы авторизации не будут устанавливать заголовки CORS для запросов Ajax. Если бы это было разрешено, у злонамеренных вкладок браузера было бы больше возможностей для получения токенов для вашего API.

Стандартный метод для SPA - использовать скрытый iframe, и это сложно для кода. oid c клиентская библиотека имеет широко используемое зрелое решение, которое я всегда использую.

Если это поможет, у меня есть некоторые ресурсы, которые показывают, как интегрировать библиотеку и выполнять автоматическое обновление токенов в рекомендуемый способ:

1 голос
/ 15 февраля 2020

если вы хотите использовать аутентификацию в приложении nuxt на моем опыте, лучшее, что вы можете использовать, это: nuxt auth module

, он обрабатывает множество кодировок, и его очень легко использовать и понимать также опубликованные на официальном сайте Nuxt

, если вы используете, что вы можете выйти с:

this.$auth.logout(/* .... */)
...