microdot.auth --- การยืนยันตัวตน HTTP

ตัวตกแต่ง (decorator) ที่คุ้มครองเส้นทาง (route) ด้วยการยืนยันตัวตน HTTP มีสองรูปแบบ: BasicAuth สำหรับรูปแบบ Authorization: Basic <base64> ที่เบราว์เซอร์จะแสดงกล่องโต้ตอบให้กรอกข้อมูลโดยอัตโนมัติ และ TokenAuth สำหรับรูปแบบ Authorization: Bearer <token> ที่ API ใช้

ทั้งสองคลาสสืบทอดจากคลาสฐาน BaseAuth ร่วมกัน แอปพลิเคชันจะสร้างออบเจ็กต์ auth จากนั้นลงทะเบียนคอลแบ็กการยืนยันตัวตนด้วย authenticate() แล้วตกแต่งเส้นทางที่ต้องการป้องกันด้วยอินสแตนซ์ auth

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

ชุดอักขระที่ประกาศใน challenge 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__() แต่ไม่ปฏิเสธคำขอที่ไม่มีข้อมูลรับรอง -- ตัวจัดการยังคงทำงาน โดย 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 รับออบเจ็กต์ request และคืนการตอบกลับ (หรือยกเลิก)

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

คืนค่าตัวจัดการที่ถูกห่อหุ้ม

optional(f: Callable) Callable

คล้ายกับ __call__() แต่ไม่ปฏิเสธคำขอที่ไม่มี token -- ตัวจัดการยังคงทำงาน โดย 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()

คืนค่าตัวจัดการที่ถูกห่อหุ้ม

class BaseAuth

class microdot.auth.BaseAuth

คลาสฐานร่วมสำหรับ BasicAuth และ TokenAuth รูปแบบการยืนยันตัวตนที่กำหนดเองสามารถสืบทอดจากคลาสนี้ได้

auth_callback: Callable | None

คอลแบ็กที่ลงทะเบียนผ่าน authenticate มีค่าเป็น None จนกว่าแอปพลิเคชันจะลงทะเบียนคอลแบ็ก (การตกแต่งฟังก์ชันด้วย @auth.authenticate คือสิ่งที่ตั้งค่านี้)

error_callback: Callable

Async callable ที่คืนการตอบกลับเมื่อการยืนยันตัวตนล้มเหลว ตั้งค่าโดย constructor ให้คืนการตอบกลับ 401 เป็นค่าเริ่มต้น สามารถแทนที่ได้ผ่าน errorhandler บน TokenAuth หรือโดยตรงบนคลาสย่อย BaseAuth ที่กำหนดเอง

เส้นทางที่ตกแต่งแล้วจะมี request.g.current_user ถูกกำหนดค่าด้วยค่าที่คืนมาจากคอลแบ็กการยืนยันตัวตน ภายในเส้นทาง ให้ตรวจสอบแอตทริบิวต์นี้เพื่อระบุตัวผู้เรียก