JavaScript · API · Середній

Токен-автентифікація

5 завдань

Реєструйте користувача, отримуйте токен і виконуйте автентифіковані API-запити.

Потік токен-автентифікації

#
**Короткий спосіб написати fetch-виклики** У секції Beginner кожен запит через fetch використовував два окремі рядки `await`: ```javascript const response = await fetch(url); const data = await response.json(); ``` Далі ви також побачите однорядковий скорочений запис із `.then()`: ```javascript const data = await fetch(url).then(r => r.json()); ``` Ці два записи рівнозначні. `.then(r => r.json())` — це колбек, прикріплений безпосередньо до Promise, що повертається `fetch()`. Коли сервер відповідає, `.then()` одразу викликає `r.json()` і повертає новий Promise. Зовнішній `await` чекає виконання цього Promise з JSON. Скорочений запис зручний, коли не потрібно перевіряти `response.status` або `response.ok` перед читанням тіла. Коли потрібна перевірка помилок, використовуйте двокроковий варіант — він дає доступ до `response` до читання тіла: ```javascript const response = await fetch(url); if (!response.ok) throw new Error(`HTTP ${response.status}`); const data = await response.json(); ``` --- Токен-автентифікація працює у два кроки: отримати токен один раз, потім включати його у кожен наступний запит. **Крок 1 — Зареєструвати нового користувача:** ```javascript const response = await fetch('https://apilearn.tukas.dev/api/auth/register/', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ username: 'alice42', email: '[email protected]', password: 'SecurePass123!', }), }); const data = await response.json(); console.log(data.token); // токен повертається одразу при реєстрації ``` **Крок 2 — Або увійти для отримання токена існуючого акаунту:** ```javascript const response = await fetch('https://apilearn.tukas.dev/api/auth/token/', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ username: 'alice42', password: 'SecurePass123!' }), }); const { token } = await response.json(); ``` **Крок 3 — Використати токен у заголовку `Authorization`:** ```javascript const headers = { 'Authorization': `Token ${token}`, 'Content-Type': 'application/json', }; const profile = await fetch('https://apilearn.tukas.dev/api/users/profile/', { headers, }).then(r => r.json()); console.log(profile.username); ``` Токен не закінчується — зберігайте та перевикористовуйте його між запитами. Формат заголовка `Authorization` — рівно `Token <token>` (з великої літери T, пробіл, потім значення токена).

Реєстрація, токен та автентифіковані запити

#
Повний потік — реєстрація, отримання токена, виконання автентифікованих запитів: ```javascript const BASE_URL = 'https://apilearn.tukas.dev'; async function register(username, email, password) { const response = await fetch(`${BASE_URL}/api/auth/register/`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ username, email, password }), }); if (!response.ok) { const err = await response.json(); throw new Error(JSON.stringify(err)); } return response.json(); // { token, user: { id, username, email } } } async function getToken(username, password) { const response = await fetch(`${BASE_URL}/api/auth/token/`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ username, password }), }); const data = await response.json(); return data.token; } async function main() { // Отримуємо токен для існуючого акаунту const token = await getToken('YOUR_USERNAME', 'YOUR_PASSWORD'); console.log('Токен:', token); // Будуємо заголовки автентифікації const headers = { 'Authorization': `Token ${token}`, 'Content-Type': 'application/json', }; // Отримуємо профіль const profile = await fetch(`${BASE_URL}/api/users/profile/`, { headers }) .then(r => r.json()); console.log('Авторизований як:', profile.username); console.log('Email:', profile.email); } main(); ``` Багаторазовий помічник для автентифікованих запитів: ```javascript function makeAuthHeaders(token) { return { 'Authorization': `Token ${token}`, 'Content-Type': 'application/json', }; } const token = await getToken('YOUR_USERNAME', 'YOUR_PASSWORD'); const headers = makeAuthHeaders(token); const cart = await fetch(`${BASE_URL}/api/cart/`, { headers }).then(r => r.json()); console.log('Товарів у кошику:', cart.items.length); ```

Довідник токен-автентифікації

#
**Ендпоінти** ``` POST /api/auth/register/ Реєстрація + отримання токена тіло: { username, email, password } повертає: { token, user: { id, username, email } } POST /api/auth/token/ Отримати токен для існуючого користувача тіло: { username, password } повертає: { token } ``` **Використання токена** ```javascript headers: { 'Authorization': `Token ${token}` } // Формат: "Token " + значення токена (велика T, один пробіл) ``` **Вимоги до паролю** ``` Мінімум 8 символів Мінімум одна велика літера Мінімум одна цифра Мінімум один спеціальний символ (!, @, #, ...) ``` **401 Unauthorized** ```javascript const response = await fetch(url, { headers }); if (response.status === 401) { console.log('Недійсний або відсутній токен'); } ``` **Ендпоінти, що потребують автентифікації** ``` GET/PATCH/PUT /api/users/profile/ GET/POST /api/cart/items/ PATCH/DELETE /api/cart/items/{id}/ POST/GET /api/orders/ ```
01

Отримати токен автентифікації

#

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

Отримати свій профіль

#

Отримайте токен, потім використайте його для запиту до `/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();
03

Що відбувається без токена

#

Спробуйте запитати `/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();
04

Зареєструвати нового користувача

#

Зареєструйте нового користувача, надіславши 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();
05

Допоміжна функція автентифікації

#

Напишіть 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();