Otevře se na nové kartě

OAuth 2.0

OAuth 2.0 patří mezi standardy, které používám tehdy, když aplikace potřebuje bezpečný delegovaný přístup k externím službám, aniž by po uživatelích požadovala přímé sdílení hesel.

S OAuth 2.0 pracuji při integracích API, ve webových aplikacích a nástrojích, které se potřebují připojit k platformám třetích stran jménem uživatele.

OAuth pro mě není jen přihlašovací tlačítko.

Je to autorizační framework, který je potřeba implementovat velmi pečlivě, protože se nachází přímo na hranici mezi identitou uživatele, oprávněními aplikace a externími službami.

Jak používám OAuth 2.0

OAuth 2.0 používám například pro:

  • propojování aplikací s externími API,
  • vyžádání přístupu autorizovaného uživatelem,
  • získávání access tokenů,
  • práci s refresh tokeny,
  • správu scopes,
  • zpracování autorizačních callbacků,
  • udržování autentizovaných API relací,
  • odvolání přístupu,
  • integrace s platformami třetích stran.

Typické integrace mohou zahrnovat služby, u kterých uživatel výslovně autorizuje aplikaci k přístupu k vybraným datům nebo funkcím jeho jménem.

Aplikace tak získává omezené oprávnění namísto hesla k uživatelskému účtu.

Autorizace, nikoli sdílení hesla

Jednou z hlavních výhod OAuth je, že uživatel nemusí externí aplikaci předávat své heslo.

Uživatele místo toho autentizuje přímo poskytovatel autorizace.

Aplikace požádá o přesně definovanou úroveň přístupu.

Uživatel tento požadavek schválí nebo zamítne.

Pokud je přístup udělen, aplikace obdrží token reprezentující povolenou autorizaci.

Vzniká tak mnohem čistší bezpečnostní hranice než při přímém sběru přihlašovacích údajů.

Authorization Code Flow

U aplikací se serverovým backendem běžně pracuji s Authorization Code flow.

Zjednodušený proces vypadá takto:

  1. aplikace přesměruje uživatele k poskytovateli autorizace,
  2. uživatel se přihlásí a udělí oprávnění,
  3. poskytovatel přesměruje uživatele zpět s autorizačním kódem,
  4. aplikace vymění tento kód za access token,
  5. access token se používá pro volání externího API.

Samotný autorizační kód má krátkou životnost a nepoužívá se přímo jako dlouhodobý přístupový údaj k API.

Toto oddělení pomáhá omezit vystavení citlivých tokenů.

PKCE

U veřejných klientů a moderních autorizačních flow poskytuje Proof Key for Code Exchange neboli PKCE další vrstvu ochrany.

Aplikace před zahájením autorizace vytvoří dočasnou tajnou hodnotu a odešle autorizačnímu serveru z ní odvozený challenge.

Při výměně autorizačního kódu musí následně předložit také původní verifier.

To pomáhá zabránit tomu, aby zachycený autorizační kód mohla vyměnit jiná aplikace.

PKCE je obzvlášť důležité u klientů, kteří nedokážou bezpečně uchovávat tradiční client secret.

Access tokeny

Access tokeny jsou přístupové údaje používané pro volání chráněných API po úspěšné autorizaci.

Považuji je za citlivá tajemství.

Neměly by být:

  • zbytečně vystavené v URL,
  • zapisované do veřejných logů,
  • commitované do source control,
  • součástí klientského kódu tam, kde je má bezpečně držet backend,
  • sdílené mezi nesouvisejícími uživateli.

Konkrétní strategie práce s tokeny závisí na architektuře aplikace a daném OAuth poskytovateli.

Expirace tokenů

Access tokeny mají obvykle záměrně krátkou životnost.

Aplikace proto musí s jejich expirací počítat a nesmí předpokládat, že token zůstane platný neomezeně dlouho.

Integrace navrhuji tak, aby dokázaly rozpoznat selhání autorizace a podle flow podporovaného poskytovatelem přístup obnovit nebo znovu autorizovat.

Expirace tokenu by měla být běžnou součástí životního cyklu aplikace, nikoli výjimečným selháním.

Refresh tokeny

Pokud je poskytovatel podporuje, refresh tokeny umožňují aplikaci získat nový access token bez toho, aby uživatel musel znovu absolvovat celý autorizační proces.

Refresh tokeny vyžadují ještě opatrnější zacházení než běžné access tokeny, protože mohou poskytovat dlouhodobější přístup.

Proto je chráním jako perzistentní přístupové údaje.

Podle architektury to může zahrnovat:

  • šifrované úložiště,
  • omezený přístup k databázi,
  • zpracování pouze na backendu,
  • rotaci tokenů,
  • podporu revokace.

Refresh token by nikdy neměl být považován za běžná aplikační data.

Scopes

OAuth scopes definují, o jaká oprávnění aplikace žádá.

Příklady mohou zahrnovat oprávnění:

  • číst profilové informace,
  • přistupovat k souborům,
  • spravovat obsah,
  • měnit konkrétní prostředky.

Preferuji požadovat pouze nejmenší množinu scopes, kterou daná funkce skutečně potřebuje.

Tím dodržuji princip nejmenších oprávnění.

Pokud aplikace potřebuje pouze číst data, neměla by žádat o právo zápisu jen proto, že poskytovatel takový scope nabízí.

Menší rozsah oprávnění zlepšuje bezpečnost i důvěru uživatele.

Souhlas uživatele

Autorizační obrazovka je důležitou součástí uživatelského prostředí.

Uživatelé by měli být schopni pochopit, o jaký přístup aplikace žádá.

Integrace navrhuji tak, aby požadovaná oprávnění jasně odpovídala skutečné funkcionalitě aplikace.

Pokud nová funkce vyžaduje další přístup, preferuji o něj požádat cíleně až ve chvíli, kdy je potřeba, místo požadavku na všechna možná oprávnění už při prvním propojení.

Redirect URI

Redirect URI jsou kritickou součástí zabezpečení OAuth.

Poskytovatel autorizace musí vědět, kam smí uživatele po dokončení autorizace vrátit.

Kde je to možné, používám přesně definované a kontrolované redirect URI namísto příliš širokých nebo dynamicky vytvářených cílů.

Špatně nakonfigurované přesměrování může vytvořit závažné bezpečnostní problémy.

Redirect konfiguraci proto považuji za součást autorizační hranice, ne za drobný technický detail.

Validace state

Parametr state je důležitý pro ochranu autorizačního flow proti podvrženým požadavkům a pro bezpečné zachování kontextu aplikace.

State hodnoty generuji a následně validuji místo toho, abych callbacku důvěřoval pouze proto, že obsahuje autorizační kód.

Aplikace musí ověřit, že callback skutečně patří k autorizačnímu procesu, který sama zahájila.

Client ID a Client Secret

OAuth aplikace běžně získávají client identifier a podle typu klienta také client secret.

Client ID identifikuje aplikaci a nemusí být důvěrné.

Client secret důvěrné je.

Důvěrné client credentials nikdy nevystavuji ve veřejném frontendovém kódu.

U webových aplikací, které potřebují serverovou OAuth funkcionalitu, patří citlivé výměny na kontrolovaný backend.

Autorizační hranice backendu

Častou chybou při API integracích je vložení důvěrných OAuth údajů přímo do JavaScriptu doručovaného prohlížeči.

Tomuto řešení se vyhýbám.

Pokud poskytovatel vyžaduje client secret nebo je potřeba chránit dlouhodobější přístupové údaje, držím výměnu tokenů a citlivé úložiště na straně serveru.

Prohlížeč dostává pouze funkcionalitu nebo informace o relaci, které skutečně potřebuje.

Tím se snižuje riziko vystavení přístupových údajů uživatelům nebo skriptům třetích stran.

OAuth v Single-Page Applications

Aplikace běžící v prohlížeči vyžadují zvýšenou opatrnost, protože celý frontendový zdrojový kód je uživateli viditelný.

Veřejní klienti se nemohou spoléhat na vložená tajemství.

Pro tento typ architektury jsou vhodnější autorizační flow navržená pro veřejné klienty, typicky s PKCE.

Konkrétní implementace závisí na poskytovateli a architektuře aplikace.

Nativní a mobilní aplikace

OAuth se běžně používá také v nativních a mobilních aplikacích.

Platí stejné obecné principy:

  • nevkládat tajemství, která nemohou skutečně zůstat tajná,
  • používat bezpečné autorizační flow,
  • validovat přesměrování,
  • minimalizovat scopes,
  • chránit perzistentní tokeny.

Operační systém může navíc poskytovat bezpečné mechanismy úložiště, které jsou vhodnější než obyčejné lokální soubory nebo preference.

Integrace API

OAuth bývá jednou vrstvou širší API integrace.

Celková architektura může vypadat například takto:

uživatel → poskytovatel autorizace → callback → úložiště tokenů → REST API → aplikační data

Každá vrstva má samostatnou odpovědnost.

OAuth odpovídá na otázku:

„Je tato aplikace oprávněna přistupovat k tomuto prostředku jménem tohoto uživatele?“

Samotné API stále definuje, jaké operace existují a jak se data vyměňují.

OAuth a REST API

S OAuth se často setkávám společně s REST API.

Po úspěšné autorizaci aplikace obvykle přikládá access token k autentizovaným API požadavkům.

Autentizační a API logiku držím oddělenou, aby se správa tokenů neduplikovala v každém požadavku aplikace.

Centralizovaný API klient může řešit například:

  • přidávání autorizačních hlaviček,
  • detekci expirovaných tokenů,
  • obnovování přístupových údajů,
  • zpracování autorizačních chyb.

Tím se integrace lépe udržuje.

Ukládání tokenů

Způsob ukládání tokenů závisí na typu aplikace.

U serverových aplikací preferuji ukládání citlivých tokenů do kontrolovaného serverového úložiště místo jejich přímého vystavení prohlížeči.

U perzistentního úložiště zohledňuji:

  • řízení přístupu k databázi,
  • šifrování,
  • oddělení přístupových údajů,
  • rotaci tokenů,
  • odstranění při odvolání přístupu.

Cílem je minimalizovat dopad v případě kompromitace jiné části aplikace.

Revokace

Uživatelé by měli mít možnost integraci odpojit.

Pokud poskytovatel podporuje revokaci, navrhuji aplikaci tak, aby bylo možné autorizaci čistě odstranit.

To může zahrnovat:

  • revokaci tokenu u poskytovatele,
  • odstranění uložených přístupových údajů,
  • vymazání souvisejícího stavu relace,
  • označení propojení jako neaktivního.

Odpojení služby by nemělo zanechat zbytečné přístupové údaje uložené bez časového omezení.

Zpracování chyb

OAuth integrace mohou selhat mnoha způsoby.

Příklady zahrnují:

  • uživatel odmítne přístup,
  • autorizační kód expiruje,
  • redirect URI neodpovídá,
  • výměna tokenu selže,
  • refresh token přestane být platný,
  • změní se scopes,
  • poskytovatel přístup odvolá.

Tyto situace zpracovávám jako očekávané aplikační stavy.

Uživatel by měl dostat srozumitelné vysvětlení a jasný způsob nápravy místo obecné serverové chyby.

Reautorizace

Někdy musí integrace požádat o autorizaci znovu.

Může k tomu dojít například, když:

  • refresh token expiruje,
  • uživatel odvolá přístup,
  • se změní požadované scopes,
  • se změní bezpečnostní pravidla poskytovatele.

Workflow navrhuji tak, aby opětovné připojení účtu bylo přímočaré a nepoškodilo existující aplikační stav.

Princip nejmenších oprávnění

Princip nejmenších oprávnění patří mezi zásady, které u OAuth integrací používám.

Aplikace by měla získat pouze ta oprávnění, která skutečně potřebuje.

To se týká:

  • scopes,
  • uložených tokenů,
  • interních oprávnění služeb,
  • přístupu k databázi.

Široká oprávnění mohou během vývoje působit pohodlně, ale zbytečně zvyšují riziko.

Bezpečnost

Implementace OAuth pracuje s citlivými přístupovými údaji a uživatelskými oprávněními, proto ji považuji za bezpečnostně kritickou část aplikačního kódu.

Zvýšenou pozornost věnuji zejména:

  • HTTPS,
  • bezpečným redirect URI,
  • validaci state,
  • PKCE,
  • důvěrnosti tokenů,
  • minimalizaci scopes,
  • ukládání přístupových údajů na backendu,
  • expiraci tokenů,
  • revokaci,
  • validaci vstupů.

Pokud vyspělý poskytovatel podporuje standardizované flow, nevymýšlím vlastní autorizační mechanismus.

OAuth sám o sobě není autentizace

OAuth 2.0 je primárně autorizační framework.

Řeší otázky delegovaného přístupu.

Neměl by být automaticky považován za kompletní systém identity.

Pokud aplikace potřebuje standardizovanou autentizaci uživatelů, odděluji tento požadavek od autorizace a používám odpovídající identitní vrstvu nebo protokol.

Jasné oddělení konceptů autentizace a autorizace pomáhá předcházet architektonickým chybám.

Důvěra uživatele

OAuth autorizace bývá jednou z prvních bezpečnostně citlivých interakcí, které uživatel s aplikací provádí.

Proto se snažím, aby celé workflow bylo transparentní.

Aplikace by měla jasně vysvětlit:

  • která služba se propojuje,
  • proč je přístup potřeba,
  • co s ním aplikace bude dělat,
  • jak lze propojení odstranit.

Kvalitní autorizační UX přímo přispívá k důvěře uživatele.

Logování bez úniku přístupových údajů

OAuth integrace potřebují užitečnou diagnostiku, logy se ale nesmí stát dalším místem, kde unikají tajné údaje.

Vyhýbám se logování celých:

  • access tokenů,
  • refresh tokenů,
  • client secrets,
  • autorizačních kódů.

Logy by měly obsahovat dostatek informací pro diagnostiku selhání, ale neměly by ukládat znovupoužitelné přístupové údaje.

OAuth a automatizovaná workflow

OAuth je užitečný také pro automatizaci, kdy aplikace potřebuje průběžný autorizovaný přístup k externí službě.

Backendový proces může například potřebovat:

  • načítat data,
  • aktualizovat prostředky,
  • synchronizovat obsah,
  • spravovat informace autorizované uživatelem.

V těchto případech se správa životního cyklu tokenů stává součástí automatizační architektury.

Workflow musí umět zpracovat expiraci a revokaci, aniž by tiše přestalo fungovat.

OAuth v mém technologickém stacku

S OAuth 2.0 běžně pracuji společně s technologiemi, jako jsou:

  • REST API,
  • JavaScript,
  • TypeScript,
  • Python,
  • PHP,
  • JSON,
  • PostgreSQL,
  • backendové služby,
  • webové aplikace,
  • integrace externích API.

OAuth poskytuje autorizační vrstvu, která bezpečně propojuje aplikaci se službami třetích stran.

Proč používám OAuth 2.0

OAuth 2.0 používám proto, že moderní aplikace často potřebují pracovat s externími platformami, aniž by přebíraly odpovědnost za uživatelské přihlašovací údaje.

Poskytuje standardizovaný způsob delegování omezeného přístupu, zatímco samotná autentizace zůstává u služby, která uživatelský účet skutečně spravuje.

Nejtěžší částí OAuth není zobrazení tlačítka „Připojit“.

Důležitá je správná implementace celého autorizačního životního cyklu: scopes, redirects, PKCE, ukládání tokenů, expirace, refresh, revokace a zpracování chyb.

Právě tak k OAuth integracím přistupuji — jako k bezpečnostně citlivé součásti aplikační architektury, ne jako k dalšímu obyčejnému API požadavku.

Zpět na hlavní stránku