microdot.auth --- Xác thực HTTP

Các decorator bảo vệ các route bằng xác thực HTTP. Có hai loại: BasicAuth dùng cơ chế Authorization: Basic <base64> mà trình duyệt hỗ trợ trực tiếp, và TokenAuth dùng cơ chế Authorization: Bearer <token> mà các API sử dụng.

Cả hai lớp đều kế thừa từ lớp cơ sở BaseAuth; ứng dụng tạo đối tượng auth, đăng ký hàm gọi lại xác thực với authenticate(), sau đó trang trí các route được bảo vệ bằng phiên bản auth.

class BasicAuth

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

Xác thực HTTP Basic. Trình duyệt hiển thị hộp thoại tên người dùng / mật khẩu khi một yêu cầu chưa được xác thực truy cập vào route được bảo vệ, và gửi Authorization: Basic <base64(user:pass)> trong các yêu cầu tiếp theo.

realm

Chuỗi realm mà trình duyệt hiển thị bên cạnh dấu nhắc.

charset

Bộ ký tự được quảng bá trong thách thức WWW-Authenticate.

scheme

Tên cơ chế xác thực. Mặc định là 'Basic'.

error_status

Mã trạng thái HTTP trả về khi xác thực thất bại. Mặc định là 401.

authenticate(f)

Decorator đăng ký hàm kiểm tra thông tin xác thực. f nhận (request, username, password) và trả về đối tượng người dùng đã xác thực (hoặc None nếu thông tin xác thực sai). Đối tượng được trả về được lưu trữ trong 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)

Trang trí một route bằng phiên bản BasicAuth để bảo vệ nó:

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

Tương tự __call__(), nhưng không từ chối các yêu cầu thiếu thông tin xác thực -- handler vẫn chạy, với request.g.current_user được đặt thành người dùng đã xác thực hoặc None.

class TokenAuth

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

Xác thực Bearer token. Client gửi token trong header Authorization; ứng dụng xác thực nó với bất kỳ kho lưu trữ nào nó muốn.

header

Tên header chứa token. Mặc định là 'Authorization' và yêu cầu giá trị có dạng Bearer <token>; một header tùy chỉnh chứa giá trị token trực tiếp.

scheme

Cơ chế xác thực cho header Authorization. Mặc định là 'Bearer'.

error_status

Mã trạng thái HTTP khi xác thực thất bại. Mặc định là 401.

authenticate(f)

Decorator đăng ký hàm kiểm tra token. f nhận (request, token) và trả về đối tượng người dùng hoặc 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)

Decorator ghi đè phản hồi 401 mặc định. f nhận đối tượng request và trả về một phản hồi (hoặc hủy).

__call__(f: Callable) Callable

Trang trí một route bằng phiên bản TokenAuth để bảo vệ nó. Các yêu cầu không có token hợp lệ sẽ bị từ chối (401 theo mặc định, hoặc kết quả trả về từ errorhandler()). Khi thành công, người dùng đã xác thực được lưu trong request.g.current_user

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

Trả về handler đã được bọc.

optional(f: Callable) Callable

Tương tự __call__(), nhưng không từ chối các yêu cầu thiếu token -- handler vẫn chạy, với request.g.current_user được đặt thành người dùng đã xác thực hoặc None. Hữu ích cho các route thay đổi đầu ra dựa trên việc người gọi có được xác thực hay không mà không yêu cầu bắt buộc:

@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()

Trả về handler đã được bọc.

class BaseAuth

class microdot.auth.BaseAuth

Lớp cơ sở chung cho BasicAuthTokenAuth. Các cơ chế xác thực tùy chỉnh có thể kế thừa từ nó.

auth_callback: Callable | None

Hàm gọi lại được đăng ký qua authenticate. Là None cho đến khi ứng dụng đăng ký hàm gọi lại (trang trí một hàm với @auth.authenticate là cách thiết lập nó).

error_callback: Callable

Callable bất đồng bộ trả về phản hồi được gửi khi xác thực thất bại. Được thiết lập bởi constructor với phản hồi 401 mặc định; thay thế nó qua errorhandler trên TokenAuth, hoặc trực tiếp trên lớp con BaseAuth tùy chỉnh.

Các route được trang trí sẽ có request.g.current_user được điền với giá trị trả về từ hàm gọi lại xác thực. Bên trong route, hãy kiểm tra thuộc tính đó để xác định người gọi.