OAuth 2.0
OAuth 2.0 — это протокол авторизации, который позволяет приложениям получать ограниченный доступ к пользовательским аккаунтам в других сервисах без получения пароля пользователя.
Роли в OAuth 2.0
- Resource Owner — пользователь, владеющий ресурсом
- Client — приложение, запрашивающее доступ
- Authorization Server — сервер авторизации
- Resource Server — сервер с защищенными ресурсами
Типы Grant в OAuth 2.0
- Authorization Code — для веб-приложений
- Implicit — для SPA (устарел)
- Resource Owner Password — с логином/паролем (не рекомендуется)
- Client Credentials — для server-to-server
- Refresh Token — обновление токенов
Поток Authorization Code
11. Client направляет пользователя на Authorization Server
2GET /authorize?
3 response_type=code&
4 client_id=CLIENT_ID&
5 redirect_uri=REDIRECT_URI&
6 scope=read&
7 state=STATE
8
92. Пользователь авторизуется и предоставляет разрешения
10
113. Authorization Server перенаправляет с кодом
12GET REDIRECT_URI?code=AUTH_CODE&state=STATE
13
144. Client обменивает код на токен
15POST /token
16{
17 "grant_type": "authorization_code",
18 "code": "AUTH_CODE",
19 "redirect_uri": "REDIRECT_URI",
20 "client_id": "CLIENT_ID",
21 "client_secret": "CLIENT_SECRET"
22}
Типы токенов
- Access Token — для доступа к API
- Refresh Token — для получения нового access token
- ID Token — информация о пользователе (OpenID Connect)
Scopes (области доступа)
- read — чтение данных
- write — запись данных
- admin — административные функции
- profile — профиль пользователя
- email — адрес электронной почты
Безопасность OAuth 2.0
- HTTPS — обязательное использование TLS
- State parameter — защита от CSRF
- PKCE — для мобильных и SPA приложений
- Короткое время жизни токенов
- Валидация redirect_uri
Пример реализации на Python (Django)
1# Установка библиотеки
2pip install django-oauth-toolkit
3# или
4poetry add django-oauth-toolkit
5
6# settings.py
7INSTALLED_APPS = [
8 'oauth2_provider',
9 # ... другие приложения
10]
11
12OAUTH2_PROVIDER = {
13 'SCOPES': {
14 'read': 'Read scope',
15 'write': 'Write scope',
16 }
17}
18
19# views.py
20from oauth2_provider.decorators import protected_resource
21
22@protected_resource()
23def protected_view(request):
24 return JsonResponse({'message': 'Hello, authenticated user!'})
FAQ
В чем разница между OAuth 2.0 и OpenID Connect?
OAuth 2.0 — это протокол авторизации, OpenID Connect — это уровень аутентификации поверх OAuth 2.0.
Безопасен ли OAuth 2.0?
OAuth 2.0 безопасен при правильной реализации: обязательное использование HTTPS, валидация параметров, короткое время жизни токенов.