JavaScript · API · Средний
Токен-аутентификация
Регистрируйте пользователя, получайте токен и выполняйте аутентифицированные API-запросы.
Краткое введение в тему и пояснения перед упражнениями (упражнения ниже):
Регистрация, токен и аутентифицированные запросы
#Справочник токен-аутентификации
#Упражнения:
Получить токен аутентификации
#POST к `/api/auth/token/` с вашими учётными данными. Выведите полученный токен.
const BASE_URL = 'https://apilearn.tukas.dev';
async function main() {
// POST /api/auth/token/ с username и password
// вывести токен
}
main();
Решение
const BASE_URL = 'https://apilearn.tukas.dev';
async function main() {
const response = await fetch(`${BASE_URL}/api/auth/token/`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ username: 'YOUR_USERNAME', password: 'YOUR_PASSWORD' }),
});
const data = await response.json();
console.log(data.token);
}
main();
Получить свой профиль
#Получите токен, затем используйте его для запроса к `/api/users/profile/`. Выведите `username` и `email`.
const BASE_URL = 'https://apilearn.tukas.dev';
async function main() {
// 1. получить токен
// 2. GET /api/users/profile/ с заголовком Authorization
// 3. вывести username и email
}
main();
Решение
const BASE_URL = 'https://apilearn.tukas.dev';
async function main() {
const { token } = await fetch(`${BASE_URL}/api/auth/token/`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ username: 'YOUR_USERNAME', password: 'YOUR_PASSWORD' }),
}).then(r => r.json());
const profile = await fetch(`${BASE_URL}/api/users/profile/`, {
headers: { 'Authorization': `Token ${token}` },
}).then(r => r.json());
console.log(profile.username);
console.log(profile.email);
}
main();
Что происходит без токена
#Попробуйте запросить `/api/users/profile/` без заголовка Authorization. Выведите `response.status` и `response.ok`. Затем повторите с действительным токеном и сравните.
const BASE_URL = 'https://apilearn.tukas.dev';
async function main() {
// 1. запросить профиль без авторизации — вывести status и ok
// 2. запросить профиль с действительным токеном — вывести status и ok
}
main();
Решение
const BASE_URL = 'https://apilearn.tukas.dev';
async function main() {
// Without token
const r1 = await fetch(`${BASE_URL}/api/users/profile/`);
console.log('No token:', r1.status, r1.ok); // 401 false
// With token
const { token } = await fetch(`${BASE_URL}/api/auth/token/`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ username: 'YOUR_USERNAME', password: 'YOUR_PASSWORD' }),
}).then(r => r.json());
const r2 = await fetch(`${BASE_URL}/api/users/profile/`, {
headers: { 'Authorization': `Token ${token}` },
});
console.log('With token:', r2.status, r2.ok); // 200 true
}
main();
Зарегистрировать нового пользователя
#Зарегистрируйте нового пользователя, отправив POST к `/api/auth/register/`. Используйте уникальное имя. Выведите токен и username из ответа.
const BASE_URL = 'https://apilearn.tukas.dev';
async function main() {
// POST /api/auth/register/ с username, email, password
// вывести token и username
}
main();
Решение
const BASE_URL = 'https://apilearn.tukas.dev';
async function main() {
const response = await fetch(`${BASE_URL}/api/auth/register/`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
username: 'newuser_' + Date.now(),
email: '[email protected]',
password: 'SecurePass123!',
}),
});
const data = await response.json();
console.log(data.token);
console.log(data.user.username);
}
main();
Вспомогательная функция аутентификации
#Напишите async-функцию `getAuthHeaders(username, password)`, которая получает токен и возвращает объект заголовков `{ Authorization: "Token ..." }`. Используйте её для запроса профиля и корзины.
const BASE_URL = 'https://apilearn.tukas.dev';
async function getAuthHeaders(username, password) {
// получить токен, вернуть объект заголовков
}
async function main() {
const headers = await getAuthHeaders('YOUR_USERNAME', 'YOUR_PASSWORD');
// использовать headers для запроса профиля и корзины
}
main();
Решение
const BASE_URL = 'https://apilearn.tukas.dev';
async function getAuthHeaders(username, password) {
const { token } = await fetch(`${BASE_URL}/api/auth/token/`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ username, password }),
}).then(r => r.json());
return { 'Authorization': `Token ${token}` };
}
async function main() {
const headers = await getAuthHeaders('YOUR_USERNAME', 'YOUR_PASSWORD');
const profile = await fetch(`${BASE_URL}/api/users/profile/`, { headers }).then(r => r.json());
console.log('Profile:', profile.username);
const cart = await fetch(`${BASE_URL}/api/cart/`, { headers }).then(r => r.json());
console.log('Cart items:', cart.items.length);
}
main();