\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}
