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)ומחזיר אובייקט משתמש אוNoneimport 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 של האימות. בתוך הנתיב, בדקו תכונה זו כדי לזהות את הקורא.