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_userbasic = 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)และคืนออบเจ็กต์ผู้ใช้หรือ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 รับออบเจ็กต์ 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 ถูกกำหนดค่าด้วยค่าที่คืนมาจากคอลแบ็กการยืนยันตัวตน ภายในเส้นทาง ให้ตรวจสอบแอตทริบิวต์นี้เพื่อระบุตัวผู้เรียก