\section{OAuth 2.0} \begin{frame}{Mi az OAuth 2.0?} \begin{block}{Definíció} OAuth 2.0 egy nyílt szabványú \textbf{autorizációs protokoll}, amely korlátozott hozzáférést ad jelszó megosztása nélkül. \end{block} \begin{itemize} \item RFC 6749 (2012) \item Autorizációra fókuszál \item Biztonságos delegált hozzáférés \item Google, Facebook, GitHub \end{itemize} \begin{exampleblock}{Használat} Alkalmazás hozzáfér Google Drive-hoz anélkül, hogy ismebné a jelszót. \end{exampleblock} \end{frame} \begin{frame}{OAuth 2.0 szerepkörök} \begin{enumerate} \item \textbf{Resource Owner (Erőforrás tulajdonos)} \begin{itemize} \item A felhasználó, aki birtokolja az erőforrást \item Engedélyezheti a hozzáférést \end{itemize} \vspace{0.3cm} \item \textbf{Client (Kliens)} \begin{itemize} \item Az alkalmazás, amely hozzáférést kér az erőforráshoz \item Például: mobil app, webalkalmazás \end{itemize} \vspace{0.3cm} \item \textbf{Authorization Server (Autorizációs szerver)} \begin{itemize} \item Kiállítja az access token-t sikeres authentikáció után \item Kezeli a felhasználói hozzájárulást \end{itemize} \vspace{0.3cm} \item \textbf{Resource Server (Erőforrás szerver)} \begin{itemize} \item Tárolja a védett erőforrásokat \item Elfogadja és validálja az access token-eket \end{itemize} \end{enumerate} \end{frame} \begin{frame}{OAuth 2.0 Flow - Áttekintés} \begin{center} \begin{tikzpicture}[node distance=2cm, auto] \node (ro) [rectangle, draw, text width=2cm, text centered] {Resource Owner}; \node (client) [rectangle, draw, below of=ro, text width=2cm, text centered] {Client}; \node (authserver) [rectangle, draw, right of=client, xshift=3cm, text width=2.5cm, text centered] {Authorization Server}; \node (resserver) [rectangle, draw, below of=authserver, text width=2.5cm, text centered] {Resource Server}; \draw[->, thick] (client) -- node[left] {1. Kérés} (ro); \draw[->, thick] (ro) -- node[above] {2. Hozzájárulás} (authserver); \draw[->, thick] (authserver) -- node[right] {3. Token} (client); \draw[->, thick] (client) -- node[above] {4. API kérés} (resserver); \draw[->, thick] (resserver) -- node[below] {5. Védett erőforrás} (client); \end{tikzpicture} \end{center} \begin{itemize} \item Az Authorization Server és Resource Server lehet ugyanaz a rendszer \item A kommunikáció HTTPS-en keresztül történik \end{itemize} \end{frame} \begin{frame}[shrink=10]{OAuth 2.0 Grant Types} \begin{block}{Grant Type} Módszer, ahogyan kliens access token-t szerez. \end{block} \begin{enumerate} \item \textbf{Authorization Code} \begin{itemize} \item Legbiztonságosabb, szerveroldali app-hoz \end{itemize} \item \textbf{Implicit} \begin{itemize} \item \textcolor{red}{Elavult!} \end{itemize} \item \textbf{Resource Owner Password} \begin{itemize} \item Közvetlen jelszó, megbízható app-okhoz \end{itemize} \item \textbf{Client Credentials} \begin{itemize} \item Machine-to-machine \end{itemize} \item \textbf{PKCE} \begin{itemize} \item Modern mobil és SPA-hoz \end{itemize} \end{enumerate} \end{frame} \begin{frame}[shrink=10]{Authorization Code Flow} \begin{block}{Leggyakrabban használt flow} Biztonságos szerveroldali alkalmazásokhoz, ahol a client secret biztonságosan tárolható. \end{block} \begin{enumerate} \small \item \textbf{Kliens átirányítja a felhasználót} az Authorization Server-re \begin{itemize} \item URL: \texttt{/authorize?client\_id=\&redirect\_uri=\&scope=\&state=} \end{itemize} \item \textbf{Felhasználó bejelentkezik és hozzájárul} \item \textbf{Authorization Server visszairányít} authorization code-dal \begin{itemize} \item URL: \texttt{redirect\_uri?code=AUTH\_CODE\&state=} \end{itemize} \item \textbf{Kliens kicseréli a code-ot} access token-re \begin{itemize} \item POST: \texttt{/token} (client\_id, client\_secret, code, redirect\_uri) \end{itemize} \item \textbf{Authorization Server visszaad} access token-t (és refresh token-t) \item \textbf{Kliens használja az access token-t} API kérésekhez \end{enumerate} \end{frame} \begin{frame}[fragile,shrink=10]{Authorization Code Flow - Példa} \begin{block}{1. Felhasználó átirányítása az authorization endpoint-ra} \small \begin{verbatim} GET /oauth/authorize? response_type=code& client_id=YOUR_CLIENT_ID& redirect_uri=https://yourapp.com/callback& scope=read write& state=xyz123 \end{verbatim} \end{block} \begin{block}{2. Callback authorization code-dal} \small \begin{verbatim} GET https://yourapp.com/callback? code=AUTH_CODE_HERE& state=xyz123 \end{verbatim} \end{block} \end{frame} \begin{frame}[fragile,shrink=10]{Authorization Code Flow - Példa (folyt.)} \begin{block}{3. Token kérés} \small \begin{verbatim} POST /oauth/token Content-Type: application/x-www-form-urlencoded grant_type=authorization_code& code=AUTH_CODE_HERE& redirect_uri=https://yourapp.com/callback& client_id=YOUR_CLIENT_ID& client_secret=YOUR_CLIENT_SECRET \end{verbatim} \end{block} \begin{block}{4. Token válasz} \small \begin{verbatim} { "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...", "token_type": "Bearer", "expires_in": 3600, "refresh_token": "tGzv3JOkF0XG5Qx2TlKWIA", "scope": "read write" } \end{verbatim} \end{block} \end{frame} \begin{frame}{PKCE (Proof Key for Code Exchange)} \begin{block}{Miért szükséges?} A natív és SPA (Single Page Application) alkalmazások nem tudják biztonságosan tárolni a client secret-et. A PKCE authorization code interception elleni védelmet nyújt. \end{block} \vspace{0.5cm} \begin{enumerate} \item Kliens generál egy random \textbf{code\_verifier} értéket \item Létrehoz egy \textbf{code\_challenge}-t a verifier-ből \begin{itemize} \item \texttt{code\_challenge = BASE64URL(SHA256(code\_verifier))} \end{itemize} \item Authorization kéréshez csatolja a \texttt{code\_challenge}-t \item Token kéréshez csatolja a \texttt{code\_verifier}-t \item Szerver ellenőrzi, hogy a verifier megfelel-e a challenge-nek \end{enumerate} \vspace{0.5cm} \begin{alertblock}{Fontos!} A PKCE ma már \textbf{minden} OAuth 2.0 flow-hoz ajánlott! \end{alertblock} \end{frame} \begin{frame}{Client Credentials Grant} \begin{block}{Machine-to-Machine hitelesítés} Amikor nincs felhasználói interakció, csak két rendszer kommunikál egymással. \end{block} \vspace{0.5cm} \begin{itemize} \item \textbf{Használati esetek:} \begin{itemize} \item Backend szolgáltatások közötti kommunikáció \item Cron job-ok, scheduled task-ok \item CLI eszközök \end{itemize} \vspace{0.3cm} \item \textbf{Folyamat:} \begin{enumerate} \item Kliens küld egy POST kérést a token endpoint-ra \item Csatolja a client\_id-t és client\_secret-et \item Szerver visszaadja az access token-t \item Kliens használja a token-t API kérésekhez \end{enumerate} \end{itemize} \vspace{0.3cm} \begin{alertblock}{Figyelem!} Nincs refresh token, mert nincs felhasználói kontextus! \end{alertblock} \end{frame} \begin{frame}[fragile]{Client Credentials Grant - Példa} \begin{block}{Token kérés} \small \begin{verbatim} POST /oauth/token Content-Type: application/x-www-form-urlencoded Authorization: Basic BASE64(client_id:client_secret) grant_type=client_credentials& scope=api.read \end{verbatim} \end{block} \vspace{0.3cm} \begin{block}{Token válasz} \small \begin{verbatim} { "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...", "token_type": "Bearer", "expires_in": 3600, "scope": "api.read" } \end{verbatim} \end{block} \end{frame} \begin{frame}[fragile]{Access Token és Refresh Token} \begin{columns} \begin{column}{0.48\textwidth} \begin{block}{Access Token} \begin{itemize} \item Rövid élettartam (pl. 1 óra) \item API kérésekhez használt \item Bearer token formátum \item Gyakran JWT \end{itemize} \end{block} \vspace{0.3cm} \textbf{Használat:} \small \begin{verbatim} Authorization: Bearer ACCESS_TOKEN \end{verbatim} \end{column} \begin{column}{0.48\textwidth} \begin{block}{Refresh Token} \begin{itemize} \item Hosszú élettartam (napok/hetek) \item Új access token kéréséhez \item Biztonságosan tárolva \item Opaque token \end{itemize} \end{block} \vspace{0.3cm} \textbf{Token megújítás:} \small \begin{verbatim} POST /oauth/token grant_type=refresh_token& refresh_token=REFRESH_TOKEN \end{verbatim} \end{column} \end{columns} \vspace{0.5cm} \begin{alertblock}{Best Practice} Az access token lejárta esetén a refresh token-nel új tokent kérünk, nem kell újra bejelentkeztetni a felhasználót! \end{alertblock} \end{frame} \begin{frame}{Scopes (Hatókörök)} \begin{block}{Mi az a scope?} A \textbf{scope} meghatározza, hogy a kliens milyen erőforrásokhoz és milyen műveletekhez férhet hozzá. \end{block} \vspace{0.5cm} \begin{itemize} \item \textbf{Granulált jogosultságok:} \begin{itemize} \item \texttt{read} - olvasási jogosultság \item \texttt{write} - írási jogosultság \item \texttt{delete} - törlési jogosultság \end{itemize} \vspace{0.3cm} \item \textbf{Erőforrás specifikus:} \begin{itemize} \item \texttt{user:email} - email cím olvasása \item \texttt{repo:write} - repository írása \item \texttt{profile:read} - profil olvasása \end{itemize} \vspace{0.3cm} \item \textbf{Best Practices:} \begin{itemize} \item Least privilege principle: csak a szükséges scope-ok \item Egyértelmű elnevezés \item Dokumentáció minden scope-hoz \end{itemize} \end{itemize} \end{frame} \begin{frame}{OpenID Connect (OIDC)} \begin{block}{Authentikációs réteg OAuth 2.0 felett} Az \textbf{OpenID Connect} kiegészíti az OAuth 2.0-t authentikációs funkcionalitással. \end{block} \vspace{0.5cm} \begin{itemize} \item \textbf{OAuth 2.0} = Autorizáció \item \textbf{OpenID Connect} = Autorizáció + Authentikáció \vspace{0.3cm} \item \textbf{ID Token:} \begin{itemize} \item JWT formátumú token \item Tartalmazza a felhasználó azonosító adatait \item Claims: \texttt{sub}, \texttt{name}, \texttt{email}, \texttt{picture}, stb. \end{itemize} \vspace{0.3cm} \item \textbf{UserInfo Endpoint:} \begin{itemize} \item További felhasználói információk lekérdezése \item Access token-nel hívható \end{itemize} \vspace{0.3cm} \item \textbf{Használat:} "Sign in with Google", "Login with Facebook" \end{itemize} \end{frame} \begin{frame}{OAuth 2.0 Biztonsági best practices} \begin{alertblock}{Kritikus biztonsági szempontok} \begin{itemize} \item \textbf{HTTPS kötelező} minden kommunikációhoz! \item \textbf{State paraméter} használata CSRF védelem miatt \item \textbf{Client secret} biztonságos tárolása (szerver oldalon) \item \textbf{Redirect URI validáció} - csak engedélyezett URI-k \item \textbf{Token lejárati idő} beállítása \item \textbf{Scope minimalizálása} - least privilege \end{itemize} \end{alertblock} \vspace{0.3cm} \begin{block}{További ajánlások} \begin{itemize} \item PKCE használata minden flow-ban \item Token revocation támogatása \item Rate limiting az endpoint-okon \item Token tárolás biztonságos helyen (HttpOnly cookie) \item Regular security audit \end{itemize} \end{block} \end{frame} \begin{frame}{Összefoglalás} \begin{itemize} \item \textbf{OAuth 2.0} = Autorizációs protokoll (nem authentikációs!) \item \textbf{Szerepkörök:} Resource Owner, Client, Authorization Server, Resource Server \item \textbf{Grant Types:} Authorization Code (PKCE), Client Credentials \item \textbf{Tokenek:} Access Token (rövid), Refresh Token (hosszú) \item \textbf{Scopes:} Granulált jogosultság kezelés \item \textbf{OpenID Connect:} OAuth 2.0 + Authentikáció \item \textbf{Biztonság:} HTTPS, state, PKCE, token biztonság \end{itemize} \vspace{0.5cm} \begin{exampleblock}{Amikor OAuth 2.0-t használunk} \begin{itemize} \item Social login implementációhoz \item Third-party API hozzáféréshez \item Microservice authentikációhoz \item Mobile és SPA alkalmazásokhoz \end{itemize} \end{exampleblock} \end{frame}