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. 1

    Authorization Request

    Клиентът пренасочва потребителя към authorization server

  2. 2

    User Authentication

    Потребителят се удостоверява и дава съгласие за достъп

  3. 3

    Authorization Grant

    Authorization server пренасочва обратно към клиента с authorization code

  4. 4

    Token Request

    Клиентът изпраща authorization code за access token

  5. 5

    Access Token Response

    Authorization server връща access token

  6. 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_SECRET

ID 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 имплементация

Заключение:

OAuth 2.0 е фундаментален протокол за модерна уеб сигурност, който решава сложния проблем на secure delegated access. Чрез разделяне на ролите и използване на токени вместо пароли, OAuth 2.0 предоставя сигурен и мащабируем начин за приложенията да взаимодействат от името на потребителите без да се налага да споделят чувствителни идентификационни данни.

Запомнете: OAuth 2.0 е за авторизация (достъп), не за удостоверяване (идентичност). За удостоверяване, използвайте OpenID Connect, който е изграден върху OAuth 2.0.