Как токены используются для авторизации в API?
Когда речь заходит о веб-разработке и API, важно понимать два ключевых понятия: аутентификация и авторизация. Эти процессы часто путают, но это разные стадии работы с пользователем.
Аутентификация vs Авторизация
- Аутентификация — это процесс проверки идентификационных данных пользователя. Проще говоря, это способ убедиться, что пользователь действительно тот, за кого себя выдает. Например, при вводе имени пользователя и пароля происходит аутентификация.
- Авторизация — это процесс определения прав доступа пользователя после его аутентификации. То есть, даже если вы подтвердили личность пользователя, необходимо выяснить, какие действия и ресурсы ему доступны (например, может ли он редактировать запись или только просматривать).
Использование токенов для аутентификации и авторизации
Токены — это небольшие фрагменты данных, которые используются для подтверждения идентичности пользователя и предоставления ему доступа к определенным ресурсам.
- После успешной аутентификации сервер генерирует токен (чаще всего JWT — JSON Web Token), который может быть отправлен клиенту. Токен включает в себя информацию о пользователе и срок действия.
- Пример кода на NestJS для генерации токена:
import { sign } from 'jsonwebtoken';
const payload = { username: user.username, sub: user.id };
const token = sign(payload, secretKey, { expiresIn: '1h' });
- Каждый раз, когда клиент хвастит данные с сервера, он должен отправить свой токен в заголовке запроса. Сервер проверяет токен, и если он действителен и не истек, пользователь получает доступ к запрашиваемому ресурсу.
- Пример использование токена в заголовке:
import axios from 'axios';
const token = 'ваш_токен';
const response = await axios.get('http://api.example.com/protected-resource', {
headers: {
Authorization: `Bearer ${token}`
}
});
Реализация в NestJS
В NestJS можно использовать Guards для проверки токенов. Пример простого Guard-а:
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
@Injectable()
export class JwtAuthGuard implements CanActivate {
constructor(private readonly jwtService: JwtService) {}
canActivate(context: ExecutionContext): boolean {
const request = context.switchToHttp().getRequest();
const token = request.headers['authorization']?.split(' ')[1];
try {
const payload = this.jwtService.verify(token);
request.user = payload; // Сохраняем пользователя в запросе
return true;
} catch (error) {
return false; // Неправильный токен
}
}
}
Это более подробное представление о том, как токены используются для аутентификации и авторизации в API. Это поможет вам лучше понять эти важные аспекты веб-разработки.