jwt --- JSON Web Tokens¶
Một triển khai nhỏ gọn của tiêu chuẩn JSON Web Token (JWT) cho MicroPython. JWT là một container nhỏ gọn, an toàn URL cho payload JSON mà người phát hành ký để người xác minh có thể phát hiện sự giả mạo và hết hạn.
Cổng MicroPython này được thiết kế nhỏ gọn có chủ ý:
Chỉ hỗ trợ HS256 (HMAC với SHA-256). Các thuật toán RSA / ECDSA / EdDSA không được triển khai; người phát hành và người xác minh phải chia sẻ một khóa bí mật đối xứng.
Claim
exp(hết hạn) tùy chọn được xử lý. Các claim đã đăng ký khác (nbf,iat,iss,aud,sub,jti) được chuyển qua không thay đổi trong payload nhưng không được xác thực; ứng dụng kiểm tra chúng nếu cần.Không có xử lý xoay khóa, JWKS, hoặc danh sách đối tượng nhận.
Các hàm¶
- jwt.encode(payload: dict, key: bytes | str, algorithm: str = 'HS256') str¶
Mã hóa payload thành JWT đã ký và trả về chuỗi serialization gọn (một
strcó dạng"header.payload.signature", mỗi phân đoạn được mã hóa Base64-URL).- payload
Một dict của các claim có thể tuần tự hóa JSON. Các claim chuẩn (
exp,iat,sub, ...) được chuyển qua nguyên vẹn; các khóa ứng dụng tùy chỉnh được phép.- key
Bí mật HMAC được chia sẻ.
bytesđược ưu tiên;strđược mã hóa UTF-8 tự động.- algorithm
Phải là
"HS256"(mặc định). Bất kỳ giá trị nào khác sẽ đưa raexceptions.InvalidAlgorithmError.
- jwt.decode(token: str, key: bytes | str, algorithms: list = ['HS256']) dict¶
Xác minh chữ ký của token và (nếu có) claim
expcủa nó, và trả về dict payload đã giải mã. Đưa ra một lớp con củaexceptions.PyJWTErrorkhi có bất kỳ lỗi nào -- người gọi thường bắt lớp cơ sở.- token
Chuỗi JWT gọn được tạo bởi
encode()(hoặc bất kỳ người phát hành tương thích nào).- key
Bí mật HMAC được chia sẻ. Phải khớp với khóa được sử dụng lúc mã hóa.
- algorithms
Danh sách các thuật toán mà người gọi sẵn sàng chấp nhận.
HS256phải có mặt, vàalgtrong header của token phải có trong danh sách. Mặc định là["HS256"].
Đưa ra:
exceptions.InvalidAlgorithmError--HS256không có trong algorithms, hoặcalgtrong header của token là bất kỳ giá trị nào khác ngoàiHS256.exceptions.InvalidTokenError-- token bị lỗi định dạng (không phân tách thành ba phân đoạn Base64-URL, hoặc một phân đoạn không thể giải mã / phân tích cú pháp dưới dạng JSON).exceptions.InvalidSignatureError-- chữ ký không khớp với HMAC được tính lại từ header và payload.exceptions.ExpiredSignatureError-- payload chứa claimexpcó giá trị nhỏ hơn thời gian Unix hiện tại. Đồng hồ của camera phải được đặt để kiểm tra này có ý nghĩa; xemntptime.settime().
Các ngoại lệ¶
Tất cả các ngoại lệ được lồng dưới thuộc tính mô-đun jwt.exceptions.
- exception exceptions.PyJWTError¶
Lớp cơ sở cho mọi lỗi JWT. Bắt lớp này nếu bạn không cần phân biệt giữa các trường hợp bên dưới.
- exception exceptions.InvalidTokenError¶
Token không hợp lệ về mặt cấu trúc -- sai số phân đoạn, phân đoạn không thể giải mã Base64, hoặc JSON không thể phân tích cú pháp. Lớp con của
exceptions.PyJWTError.
- exception exceptions.InvalidAlgorithmError¶
Thuật toán của token không có trong danh sách được người gọi chấp nhận, hoặc người gọi yêu cầu thuật toán khác ngoài
HS256. Lớp con củaexceptions.PyJWTError.
- exception exceptions.InvalidSignatureError¶
Chữ ký của token không khớp với HMAC được tính từ header và payload bằng khóa được cung cấp. Lớp con của
exceptions.PyJWTError.
- exception exceptions.ExpiredSignatureError¶
Claim
expcủa token đã quá hạn. Lớp con củaexceptions.PyJWTError.. Thời gian thực của camera phải được đặt (quantptime.settime()) để kiểm tra này có ý nghĩa.
Ví dụ¶
Chu trình phát hành/xác minh với bí mật đối xứng:
import jwt
import time
SECRET = b"keep-this-out-of-source-control"
payload = {
"sub": "kitchen-cam",
"role": "admin",
"exp": time.time() + 3600, # 1 hour from now
}
token = jwt.encode(payload, SECRET)
print("token:", token)
try:
claims = jwt.decode(token, SECRET)
except jwt.exceptions.PyJWTError as e:
print("rejected:", type(e).__name__)
else:
print("subject:", claims["sub"])
Cùng một bí mật được sử dụng để ký và xác minh, vì vậy người xác minh phải giữ khóa mà người phát hành đã dùng. Đối với các dịch vụ mà camera là người phát hành (cấp token cho điện thoại được ghép nối), hãy giữ bí mật trên hệ thống tệp camera và xử lý nó như bất kỳ thông tin xác thực dài hạn nào khác -- xem Các thao tác: khóa, hết hạn và xử lý sự cố.