microdot.auth — אימות HTTP

דקורטורים שחוסמים נתיבים מאחורי אימות HTTP. שני סוגים: BasicAuth עבור סכמת Authorization: Basic <base64> שדפדפנים מבקשים עליה באופן מובנה, ו-TokenAuth עבור סכמת Authorization: Bearer <token> שבה ממשקי API משתמשים.

שתי המחלקות נגזרות מבסיס משותף BaseAuth; יישום בונה את אובייקט האימות, רושם פונקציית callback לאימות באמצעות authenticate(), ואז מקשט את הנתיבים המוגנים עם מופע האימות.

class BasicAuth

class microdot.auth.BasicAuth(realm: str = 'Please login', charset: str = 'UTF-8', scheme: str = 'Basic', error_status: int = 401)

אימות HTTP Basic. הדפדפן מקפיץ תיבת דו-שיח של שם משתמש / סיסמה כאשר בקשה לא מאומתת פוגעת בנתיב מוגן, ושולח Authorization: Basic <base64(user:pass)> בבקשות הבאות.

realm

מחרוזת ה-realm שהדפדפן מציג ליד ההנחיה.

charset

ה-Charset המוצהר באתגר WWW-Authenticate.

scheme

שם סכמת האימות. ברירת מחדל 'Basic'.

error_status

סטטוס HTTP המוחזר בעת כישלון אימות. ברירת מחדל 401.

authenticate(f)

דקורטור שרושם את בדיקת האישורים. f מקבל (request, username, password) ומחזיר את אובייקט המשתמש המאומת (או None במקרה של אישורים שגויים). האובייקט המוחזר מאוחסן ב-request.g.current_user.

basic = BasicAuth(realm='Camera')

@basic.authenticate
async def check(request, username, password):
    user = users.get(username)
    if user and user.check_password(password):
        return user
__call__(f)

קישוט נתיב עם מופע BasicAuth מגן עליו:

@app.route('/admin')
@basic
def admin(request):
    return 'hello ' + request.g.current_user.name
optional(f)

כמו __call__(), אך אינו דוחה בקשות חסרות אישורים – ה-handler עדיין רץ, כאשר request.g.current_user מוגדר למשתמש המאומת או ל-None.

class TokenAuth

class microdot.auth.TokenAuth(header: str = 'Authorization', scheme: str = 'Bearer', error_status: int = 401)

אימות מבוסס Bearer-token. לקוחות שולחים token בכותרת Authorization; היישום מאמת אותו מול כל מאגר נתונים שירצה.

header

שם הכותרת הנושאת את ה-token. ברירת המחדל 'Authorization' מצפה לערך Bearer <token>; כותרת מותאמת אישית נושאת את ערך ה-token ישירות.

scheme

סכמת אימות עבור כותרת Authorization. ברירת מחדל 'Bearer'.

error_status

סטטוס HTTP בעת כישלון אימות. ברירת מחדל 401.

authenticate(f)

דקורטור שרושם את בדיקת ה-token. f מקבל (request, token) ומחזיר אובייקט משתמש או None

import jwt

tokens = TokenAuth()

@tokens.authenticate
async def check(request, token):
    try:
        claims = jwt.decode(token, SECRET)
    except jwt.exceptions.PyJWTError:
        return None
    return claims['sub']
errorhandler(f)

דקורטור שדורס את תגובת 401 שבברירת המחדל. f מקבל את אובייקט הבקשה ומחזיר תגובה (או מבטל).

__call__(f: Callable) Callable

קישוט נתיב עם מופע TokenAuth מגן עליו. בקשות ללא token תקף נדחות (401 כברירת מחדל, או כל מה ש-errorhandler() החזיר). בהצלחה, המשתמש המאומת נמצא ב-request.g.current_user

@app.get('/api/me')
@tokens
async def me(request):
    return {'user': request.g.current_user}

מחזיר את ה-handler העטוף.

optional(f: Callable) Callable

כמו __call__(), אך אינו דוחה בקשות חסרות token – ה-handler עדיין רץ, כאשר request.g.current_user מוגדר למשתמש המאומת או ל-None. שימושי לנתיבים שמשנים את הפלט שלהם בהתאם לשאלה אם הקורא מאומת, מבלי לדרוש זאת:

@app.get('/api/feed')
@tokens.optional
async def feed(request):
    if request.g.current_user:
        return personalized_feed(request.g.current_user)
    return public_feed()

מחזיר את ה-handler העטוף.

class BaseAuth

class microdot.auth.BaseAuth

בסיס משותף עבור BasicAuth ו-TokenAuth. סכמות אימות מותאמות אישית יכולות לרשת אותו.

auth_callback: Callable | None

פונקציית ה-callback הרשומה באמצעות authenticate. None עד שהיישום רושם את ה-callback (קישוט פונקציה עם @auth.authenticate הוא מה שמגדיר אותה).

error_callback: Callable

קריאה אסינכרונית המחזירה את התגובה הנשלחת בעת כישלון אימות. מוגדרת על ידי הבנאי לברירת מחדל המחזירה תגובת 401; החליפו אותה באמצעות errorhandler ב-TokenAuth, או ישירות במחלקת משנה מותאמת אישית של BaseAuth.

הנתיבים המקושטים מקבלים את request.g.current_user מאוכלס בערך המוחזר מפונקציית ה-callback של האימות. בתוך הנתיב, בדקו תכונה זו כדי לזהות את הקורא.