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, валидация параметров, короткое время жизни токенов.