Ответ
Процесс получения токена на клиенте (например, в браузере) обычно следует схеме "Credential Grant". Клиент отправляет учетные данные пользователя (логин/пароль) на сервер, а сервер в ответ возвращает токен доступа.
Основные шаги:
- Отправка учетных данных: Клиент выполняет POST-запрос на специальный эндпоинт (например,
/api/token) с логином и паролем в теле запроса. - Валидация на сервере: Сервер проверяет учетные данные.
- Генерация и отправка токена: В случае успеха сервер генерирует токен (чаще всего JWT) и возвращает его клиенту в теле ответа.
Пример на JavaScript с использованием fetch:
async function login(username, password) {
try {
const response = await fetch('https://api.example.com/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ username, password })
});
if (!response.ok) {
throw new Error(`Authentication failed with status: ${response.status}`);
}
const data = await response.json();
const accessToken = data.access_token;
// Важно: Хранить токен безопасно!
// localStorage не является безопасным местом из-за XSS-уязвимостей.
// Лучшая практика — использовать HttpOnly cookie, устанавливаемые сервером.
console.log('Received token:', accessToken);
// Далее токен используется в заголовках для других запросов
// headers: { 'Authorization': `Bearer ${accessToken}` }
} catch (error) {
console.error('Login error:', error);
}
}
login('user@example.com', 'securepassword');
Ключевой аспект безопасности — хранение токена. Хранение в localStorage или sessionStorage делает его уязвимым для XSS-атак. Наиболее безопасным методом является использование HttpOnly cookie, которые недоступны для чтения из JavaScript.