444 lines
13 KiB
TeX
444 lines
13 KiB
TeX
\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}
|