authn_z
This commit is contained in:
@@ -0,0 +1,154 @@
|
||||
\section{OAuth 2.0}
|
||||
|
||||
\begin{frame}[shrink=15]{Mi az OAuth 2.0?}
|
||||
\begin{block}{Definíció}
|
||||
Autorizációs protokoll - korlátozott hozzáférés jelszó megosztása nélkül.
|
||||
\end{block}
|
||||
\begin{itemize}
|
||||
\item RFC 6749 (2012)
|
||||
\item Google, Facebook, GitHub használja
|
||||
\item Példa: App hozzáfér Google Drive-hoz jelszó nélkül
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[shrink=15]{OAuth 2.0 szerepkörök}
|
||||
\begin{enumerate}
|
||||
\item \textbf{Resource Owner}: Felhasználó (birtokolja erőforrást)
|
||||
\item \textbf{Client}: Alkalmazás (hozzáférést kér)
|
||||
\item \textbf{Authorization Server}: Token kiállító
|
||||
\item \textbf{Resource Server}: Védett erőforrás tároló
|
||||
\end{enumerate}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[shrink=15]{OAuth 2.0 Flow}
|
||||
\begin{center}
|
||||
\begin{tikzpicture}[node distance=1.8cm, auto]
|
||||
\node (ro) [rectangle, draw, text width=1.8cm, text centered] {Resource Owner};
|
||||
\node (client) [rectangle, draw, below of=ro, text width=1.8cm, text centered] {Client};
|
||||
\node (auth) [rectangle, draw, right of=client, xshift=2.5cm, text width=2cm, text centered] {Auth Server};
|
||||
\node (res) [rectangle, draw, below of=auth, text width=2cm, text centered] {Resource Server};
|
||||
|
||||
\draw[->, thick] (client) -- node[left] {1. Kérés} (ro);
|
||||
\draw[->, thick] (ro) -- node[above] {2. OK} (auth);
|
||||
\draw[->, thick] (auth) -- node[right] {3. Token} (client);
|
||||
\draw[->, thick] (client) -- node[above] {4. API} (res);
|
||||
\draw[->, thick] (res) -- node[below] {5. Data} (client);
|
||||
\end{tikzpicture}
|
||||
\end{center}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[shrink=15]{Grant Types}
|
||||
\begin{enumerate}
|
||||
\item \textbf{Authorization Code}: Szerver app, legbiztonságosabb
|
||||
\item \textbf{Implicit}: \textcolor{red}{Elavult!}
|
||||
\item \textbf{Resource Owner Password}: Közvetlen jelszó, megbízható app
|
||||
\item \textbf{Client Credentials}: Machine-to-machine
|
||||
\item \textbf{PKCE}: Modern mobil/SPA
|
||||
\end{enumerate}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[shrink=20]{Authorization Code Flow lépések}
|
||||
\begin{enumerate}
|
||||
\item Kliens átirányít: \texttt{/authorize?client\_id=\&redirect\_uri=\&scope=}
|
||||
\item Felhasználó bejelentkezik és hozzájárul
|
||||
\item Auth Server visszairányít: \texttt{redirect\_uri?code=AUTH\_CODE}
|
||||
\item Kliens kicseréli code-ot: POST \texttt{/token}
|
||||
\item Auth Server ad access token-t (+ refresh)
|
||||
\item Kliens használja tokent: \texttt{Authorization: Bearer <token>}
|
||||
\end{enumerate}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile,shrink=20]{Authorization Code - Auth kérés}
|
||||
\begin{verbatim}
|
||||
GET /oauth/authorize?
|
||||
response_type=code&
|
||||
client_id=YOUR_CLIENT_ID&
|
||||
redirect_uri=https://app.com/callback&
|
||||
scope=read write&
|
||||
state=xyz123
|
||||
\end{verbatim}
|
||||
\begin{verbatim}
|
||||
// Callback
|
||||
GET https://app.com/callback?
|
||||
code=AUTH_CODE&
|
||||
state=xyz123
|
||||
\end{verbatim}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile,shrink=20]{Authorization Code - Token csere}
|
||||
\begin{verbatim}
|
||||
POST /oauth/token
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
|
||||
grant_type=authorization_code&
|
||||
code=AUTH_CODE&
|
||||
redirect_uri=https://app.com/callback&
|
||||
client_id=YOUR_ID&
|
||||
client_secret=YOUR_SECRET
|
||||
\end{verbatim}
|
||||
\begin{verbatim}
|
||||
// Válasz
|
||||
{
|
||||
"access_token": "eyJ...",
|
||||
"expires_in": 3600,
|
||||
"refresh_token": "tGzv..."
|
||||
}
|
||||
\end{verbatim}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[shrink=15]{PKCE (Proof Key for Code Exchange)}
|
||||
\begin{block}{Miért?}
|
||||
Authorization Code Flow biztonságosabbá tétele mobil/SPA app-okhoz.
|
||||
\end{block}
|
||||
\begin{enumerate}
|
||||
\item Kliens generál \texttt{code\_verifier} (random string)
|
||||
\item Hash: \texttt{code\_challenge = SHA256(code\_verifier)}
|
||||
\item Auth kéréshez csatol: \texttt{code\_challenge}
|
||||
\item Token kérésnél küldi: \texttt{code\_verifier}
|
||||
\item Server validálja: \texttt{SHA256(verifier) == challenge}
|
||||
\end{enumerate}
|
||||
\begin{alertblock}{Védelem}
|
||||
Megakadályozza authorization code ellopását.
|
||||
\end{alertblock}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[shrink=15]{Scope és Permission}
|
||||
\begin{block}{Scope}
|
||||
Jogosultság amit app kér. Példa: \texttt{read:user write:repo}
|
||||
\end{block}
|
||||
\begin{itemize}
|
||||
\item Felhasználó látja mit kér az app
|
||||
\item Csak kért scope-okat kapja meg
|
||||
\item Token tartalmazza scope-okat
|
||||
\end{itemize}
|
||||
\begin{exampleblock}{GitHub példa}
|
||||
\texttt{repo, user, gist, notifications}
|
||||
\end{exampleblock}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile,shrink=20]{Access Token használata}
|
||||
\begin{verbatim}
|
||||
// API kérés Bearer token-nel
|
||||
GET /api/user/profile
|
||||
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
|
||||
\end{verbatim}
|
||||
\begin{verbatim}
|
||||
// Express validálás
|
||||
app.get('/api/user', (req, res) => {
|
||||
const token = req.headers.authorization?.split(' ')[1];
|
||||
// Token validálás...
|
||||
res.json({ user: userData });
|
||||
});
|
||||
\end{verbatim}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[shrink=15]{OAuth 2.0 Security}
|
||||
\begin{enumerate}
|
||||
\item \textbf{HTTPS kötelező}: Minden kommunikáció
|
||||
\item \textbf{State parameter}: CSRF védelem
|
||||
\item \textbf{Redirect URI validation}: Előre regisztrált URI
|
||||
\item \textbf{Short token lifetime}: Access token max 1 óra
|
||||
\item \textbf{PKCE használata}: Mobil/SPA app-okhoz
|
||||
\item \textbf{Scope limitation}: Csak szükséges jogok
|
||||
\end{enumerate}
|
||||
\end{frame}
|
||||
Reference in New Issue
Block a user