SIKS – vježba 8 – Implementacija OAuth 2.0

Uvod

OAuth 2.0 je standardizirani protokol za autorizaciju koji omogućava siguran pristup resursima korisnika na jednom servisu, poput Googlea, bez potrebe za otkrivanjem korisničkih kredencijala trećoj strani. Ovaj protokol koristi se za autorizaciju aplikacija, web stranica i drugih servisa kako bi pristupili zaštićenim resursima korisnika, poput e-mail adrese ili kalendara, s korisnikovim pristankom.

U srcu OAuth 2.0 protokola je koncept “tokena”, koji služi kao zamjena za korisničke kredencijale. Tokeni omogućuju aplikacijama da izvrše akcije u ime korisnika, dok istovremeno ograničavaju pristup samo na one resurse za koje je korisnik dao dozvolu. Ovaj pristup povećava sigurnost, smanjujući rizik od kompromitacije korisničkih kredencijala i omogućujući korisnicima veću kontrolu nad svojim podacima.

Tijekom ove vježbe, koristit ćemo Flask, lagan i fleksibilan web framework za Python, zajedno s Authlib bibliotekom, kako bismo implementirali OAuth 2.0 autentikaciju koristeći Google kao pružatelja identiteta. Kroz praktičan rad, istražit ćemo kako se uspostavlja sigurna komunikacija između klijenta i Googlea, kako se koriste tokeni za pristup korisničkim podacima, te kako se osigurava da su svi podaci zaštićeni tijekom prijenosa.

Upute:

Prvo, osigurajte da imate instaliran Python i pip. Zatim instalirajte Flask i Authlib:

pip install Flask Authlib

Posjetite: https://console.developers.google.com/

Kreirajte novi projekt

U Credentials, kreirajte OAuth 2.0 Client IDs.

Postavite Authorized redirect URIs na https://localhost:5000/auth

Zabilježite Client ID i Client Secret

Napravite novu Python datoteku, npr. app.py, i dodajte sljedeći kod:

from flask import Flask, redirect, url_for, session, abort
from authlib.integrations.flask_client import OAuth
import os

app = Flask(__name__)
app.secret_key = os.environ.get('SECRET_KEY', os.urandom(24))

oauth = OAuth(app)
google = oauth.register(
    name='google',
    client_id='',
    client_secret='',
    server_metadata_url='https://accounts.google.com/.well-known/openid-configuration',
    access_token_url='https://accounts.google.com/o/oauth2/token',
    authorize_url='https://accounts.google.com/o/oauth2/auth',
    client_kwargs={'scope': 'openid email profile'}
)

@app.route('/')
def home():
    email = session.get('email')
    if email:
        return f'Hello, {session["name"]}! <br><img src="{session["picture"]}" /><br><a href="/logout">Logout</a>'
    return 'You are not logged in. <br><a href="/login">Login with Google</a>'

@app.route('/login')
def login():
    redirect_uri = url_for('authorize', _external=True)
    return google.authorize_redirect(redirect_uri)

@app.route('/auth')
def authorize():
    try:
        token = google.authorize_access_token()
        resp = google.get('userinfo').json()
        session['email'] = resp['email']
        session['name'] = resp['name']
        session['picture'] = resp['picture']
        return redirect('/')
    except Exception as e:
        print(e)
        abort(500)

@app.route('/logout')
def logout():
    session.pop('email', None)
    session.pop('name', None)
    session.pop('picture', None)
    return redirect('/')

if __name__ == '__main__':
    app.run(debug=True, ssl_context='adhoc')  # Use ssl_context for HTTPS in development

Zamijenite YOUR_CLIENT_ID i YOUR_CLIENT_SECRET s vašim stvarnim vrijednostima.

Pokrenite aplikaciju koristeći:

python app.py

Otvorite web preglednik i posjetite https://localhost:5000/. Kliknite na “Login with Google” kako biste testirali OAuth autentikaciju.

Dok je Wireshark aktivan, prijavite se na web aplikaciju koja koristi Google OAuth. To će generirati mrežni promet koji će Wireshark snimiti.

Nakon što ste se prijavili, zaustavite snimanje u Wiresharku. Pregledajte snimljeni promet tražeći pakete koji su označeni kao “Protected Payload”. Ovo ukazuje na to da su podaci unutar tih paketa enkriptirani.

Nakon što se prijavite s vašim Google računom, trebali biste biti preusmjereni natrag na vašu aplikaciju gdje će se prikazati vaše ime i slika profila.

Ovaj primjer demonstrira osnovnu implementaciju OAuth autentikacije koristeći Google kao pružatelja identiteta. Flask i Authlib olakšavaju rad s OAuth protokolom, omogućujući vam da se fokusirate na razvoj vaše aplikacije umjesto na složenosti autentikacijskog protokola