OAuth2
Категория: Сигурност
Какво е OAuth 2.0?
OAuth 2.0 е отворен стандарт за авторизация, който позволява на приложения да получават ограничен достъп до потребителски акаунти в уеб приложения. Той предоставя на клиентските приложения "secure delegated access" към сървърни ресурси от името на ресурсния собственик.
OAuth 2.0 е фундаментален протокол за модерна уеб сигурност и се използва от почти всички големи технологични компании.
Основни понятия в OAuth 2.0:
- Resource Owner (Ресурсен собственик) - Потребителят, който притежава защитените ресурси и може да даде достъп до тях
- Client (Клиент) - Приложението, което иска достъп до защитените ресурси от името на ресурсния собственик
- Authorization Server (Авторизационен сървър) - Сървърът, който издава access tokens на клиента след успешна авторизация
- Resource Server (Ресурсен сървър) - Сървърът, който хоства защитените ресурси и приема access tokens за достъп до тях
- Access Token (Токен за достъп) - Токен, който дава достъп до специфични ресурси за определен период от време
- Scope (Обхват) - Набор от разрешения, които клиентът иска от ресурсния собственик
OAuth 2.0 Authorization Code Flow:
- 1
Authorization Request
Клиентът пренасочва потребителя към authorization server
- 2
User Authentication
Потребителят се удостоверява и дава съгласие за достъп
- 3
Authorization Grant
Authorization server пренасочва обратно към клиента с authorization code
- 4
Token Request
Клиентът изпраща authorization code за access token
- 5
Access Token Response
Authorization server връща access token
- 5
API Access
Клиентът използва access token за достъп до защитени ресурси
Типове Grant Flows в OAuth 2.0:
Authorization Code
Характеристики:
- Най-безопасен flow за уеб приложения
- Използва server-to-server комуникация
- Поддържа client secret
- Идеален за уеб приложения с backend
Използва се за:
- Традиционни уеб приложения
- Single Page Applications с backend
- Mobile приложения с backend
Authorization Code with PKCE
Характеристики:
- Подобрена сигурност за публични клиенти
- Използва code verifier и code challenge
- Предотвратява authorization code interception
Използва се за:
- Single Page Applications
- Mobile приложения
- Desktop приложения
Implicit (Deprecated)
Характеристики:
- Остарял - не се препоръчва
- Директно връщане на access token
- По-малко сигурен
Замени се с:
- Authorization Code with PKCE
Client Credentials
Характеристики:
- Machine-to-machine комуникация
- Няма потребителско участие
- Използва client ID и secret
Използва се за:
- API-to-API комуникация
- Background services
- Automated processes
Resource Owner Password Credentials
Характеристики:
- Директно подаване на username/password
- Високо ниво на доверие между клиент и сървър
- Не се препоръчва за публични клиенти
Използва се за:
- First-party приложения
- Highly trusted environments
Device Authorization
Характеристики:
- За устройства с ограничен input capability
- Използва device code и user code
- Потребителят авторизира на друго устройство
Използва се за:
- Smart TV приложения
- Gaming конзоли
- IoT устройства
Токени в OAuth 2.0:
Access Token
Характеристики:
- Краткотраен - обикновено 1 час
- Дава достъп до защитени ресурси
- Изпраща се в Authorization header
- Може да бъде JWT или opaque token
Пример:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...Refresh Token
Характеристики:
- Дълготраен - дни, седмици или месеци
- Използва се за получаване на нов access token
- Съхранява се сигурно на сървъра
- Може да бъде отнет (revoked)
Refresh заявка:
POST /token Content-Type: application/x-www-form-urlencoded grant_type=refresh_token& refresh_token=REFRESH_TOKEN& client_id=CLIENT_ID& client_secret=CLIENT_SECRETID Token (OpenID Connect)
Характеристики:
- JWT token съдържащ потребителска информация
- Част от OpenID Connect extension
- Съдържа claims за потребителя
- Използва се за удостоверяване
Сигурностни добри практики:
- Използвайте HTTPS - Винаги използвайте HTTPS за всички OAuth комуникации
- Валидирайте redirect_uri - Строго валидирайте и ограничавайте позволените redirect URIs
- Използвайте State параметър - Винаги използвайте state параметър за предотвратяване на CSRF атаки
- Използвайте PKCE - За всички публични клиенти (SPA, mobile apps) използвайте PKCE
- Ограничете времето на токените - Използвайте кратки access tokens и secure refresh tokens
- Регулирайте scope-овете - Принцип на най-малките привилегии - давайте само необходимите разрешения
Реални примери за OAuth 2.0:
- “Влез с Google/Facebook” - Когато сайт ви позволява да влезете с вашия Google или Facebook акаунт
- Достъп до Gmail API - Приложение, което иска достъп до вашите имейли в Gmail
- API достъп до облачни услуги - Приложения, които достъпват AWS, Azure или Google Cloud APIs
- Платежни системи - Stripe, PayPal и други платежни системи използват OAuth 2.0
- Business APIs - Salesforce, Slack, GitHub и други enterprise платформи
OAuth 2.0 срещу OpenID Connect:
OAuth 2.0
Характеристики:
- Авторизация - дава достъп до ресурси
- Връща Access Token
- Въпрос: “Какви неща може да прави това приложение?”
- Делегиране на достъп
OpenID Connect (OIDC)
Характеристики:
- Удостоверяване - потвърждава идентичност
- Връща ID Token + Access Token
- Въпрос: “Кой е този потребител?”
- Extension на OAuth 2.0
Популярни OAuth 2.0 библиотеки:
JavaScript/Node.js
- Passport.js - Authentication middleware
- oauth2-server - Пълна OAuth 2.0 имплементация
- simple-oauth2 - Лека OAuth 2.0 клиентска библиотека
Python
- Authlib - OAuth 1/2 и OpenID Connect
- requests-oauthlib - OAuth поддръжка за Requests
- django-oauth-toolkit - OAuth 2.0 за Django
Java
- Spring Security OAuth - OAuth поддръжка за Spring
- Apache Oltu - OAuth имплементация
- ScribeJava - Simple OAuth библиотека
C#/.NET
- IdentityServer - OpenID Connect и OAuth 2.0 framework
- Microsoft.Identity.Web - Официална Microsoft библиотека
- OAuth.NET - OAuth 2.0 имплементация