This commit is contained in:
magdo
2026-02-24 01:29:59 +01:00
parent 77f7eb2664
commit 31d4479c63
16 changed files with 4494 additions and 0 deletions
+443
View File
@@ -0,0 +1,443 @@
\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}