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();