Как осуществить авторизацию на одном домене и перейти на другой домен?

Как можно обеспечить сохранение токена авторизации в localstorage в таком формате, чтобы приложение, к которому он относится, могло получить к нему доступ при переходе в это приложение без потери авторизации?
  • 23 января 2024 г. 12:53
Ответы на вопрос 2
Авторизация на одном домене и переход на другой домен с сохранением сеанса — это распространенная задача, особенно в сценариях Single Sign-On (SSO). Поскольку `localStorage` привязан к домену и не доступен между разными доменами, необходимо использовать другие методы. Один из подходов — использование токенов и серверной логики. 

Вот как можно реализовать процесс:

1. **Централизованный сервер авторизации (Auth Server):**
   - Разработайте отдельный сервер авторизации, который будет обрабатывать вход пользователей и выдавать токены (например, JWT - JSON Web Tokens).
   - При успешной авторизации сервер создает токен, который может содержать идентификатор пользователя и другую информацию, а затем подписывает его секретным ключом.

2. **Передача токенов авторизации:**
   - После того как пользователь авторизован на Auth Server, его браузер перенаправляется на целевой домен с включением токена в запросе, как правило, через URL-параметры.

3. **Чтение и сохранение токена:**
   - Приложение на целевом домене извлекает токен из URL-параметров и выполняет его проверку (к примеру, отправляя запрос на Auth Server, который верифицирует подпись токена).
   - После положительной верификации приложение может сохранить токен в `localStorage` целевого домена и использовать его для последующих запросов к API, который требует авторизации.

4. **Использование кук (cookies):**
   - В некоторых случаях можно использовать куки, которые устанавливаются Auth Server с атрибутом `domain` со значением основного домена. 
   - Если у вас есть домены вида `subdomain.example.com` и `another.example.com`, установка куки с доменом `.example.com` позволит читать эту куку на любом поддомене. Однако подход с куками требует детального обдумывания с точки зрения безопасности (помните о флагах `Secure` и `HttpOnly`, а также `SameSite`).

5. **Перекрестные запросы (Cross-origin requests):**
   - Используйте CORS (Cross-Origin Resource Sharing) на сервере, чтобы разрешить приложениям на разных доменах обмениваться данными.

6. **Web Storage Access API (для Safari и некоторых других браузеров):**
   - Safari представил API доступа к области хранения (Storage Access API) для усиления приватности и позволяющее сторонним контентам запрашивать разрешение на доступ к своим данным в `localStorage`.

Пример перенаправления с токеном (passing token via URL):

```javascript
// Перенаправляем пользователя на целевой домен с JWT токеном
window.location.href = `https://anotherdomain.com/landing?token=${encodeURIComponent(jwtToken)}`;
```

На стороне целевого домена (разбор URL для получения токена и сохранение его в localStorage):

```javascript
function getParameterByName(name, url = window.location.href) {
    name = name.replace(/[\[\]]/g, '\\$&');
    const regex = new RegExp(`[?&]${name}(=([^&#]*)|&|#|$)`),
          results = regex.exec(url);
    if (!results) return null;
    if (!results[2]) return '';
    return decodeURIComponent(results[
Как вариант редиректить в приложение делать с указанием токена в url (domain.com?token=...) 
В этом приложении вытаскивать токен из url и сохранять в localStorage, ну и естественно почистить url в конце.
Похожие вопросы