扫描二维码
关注或者微信搜一搜:编程智域 前端至全栈交流与成长
发现1000+提升效率与开发的AI工具和实用程序:https://tools.cmdragon.cn/
适用场景:Web应用间的安全授权(如Google登录)
FastAPI推荐实现方式:
from fastapi.security import OAuth2PasswordBearer
oauth2_scheme = OAuth2PasswordBearer(
tokenUrl="token",
scopes={"read": "读取权限", "write": "写入权限"}
)
微服务间通信典型配置:
class ClientCredentials(BaseModel):
client_id: str
client_secret: str
@app.post("/service-token")
async def get_service_token(credentials: ClientCredentials):
verify_client(credentials) # 自定义校验逻辑
return {"access_token": create_jwt(...)}
移动端单页应用安全实践:
@app.get("/implicit-redirect")
async def implicit_redirect(response_type: str, client_id: str):
if response_type != "token":
raise HTTPException(400, "仅支持token响应类型")
# 执行客户端验证和用户认证
return RedirectResponse(f"app://callback#token={generated_token}")
{
"alg": "HS256",
"typ": "JWT"
}
.
{
"sub": "user123",
"exp": 1720323600,
"scopes": ["read", "write"]
}
.
# JWT配置最佳实践
jwt_settings = {
"algorithm": "HS256", # 禁止使用none算法
"expires_minutes": 30, # 短期有效
"issuer": "your-api-server", # 签发者验证
"audience": ["web-app"], # 接收方验证
"leeway_seconds": 10 # 时钟容差
}
from fastapi import Depends
from jose import JWTError
async def get_current_user(token: str = Depends(oauth2_scheme)):
try:
payload = decode_jwt(token)
user = get_user(payload["sub"])
if user is None:
raise credentials_exception
return user
except JWTError:
raise credentials_exception
@app.get("/protected")
async def protected_route(user: User = Depends(get_current_user)):
return {"message": "安全访问成功"}
from fastapi import HTTPException
from starlette import status
credentials_exception = HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="无法验证凭证",
headers={"WWW-Authenticate": "Bearer"},
)
@app.exception_handler(JWTError)
async def jwt_exception_handler(request, exc):
return JSONResponse(
status_code=401,
content={"detail": "令牌验证失败"},
headers={"WWW-Authenticate": "Bearer"}
)
场景:需要构建IoT设备到服务器的认证系统,设备没有用户交互界面,应该选择哪种模式?
A) 授权码模式
B) 密码模式
C) 客户端凭证模式
D) 简化模式
答案与解析:
正确选项C。IoT设备属于可信客户端,可以直接使用预分配的客户端ID和密钥进行认证,符合客户端凭证模式的应用场景。
问题:为什么建议将JWT存储在HttpOnly Cookie而不是localStorage?
答案解析:
HttpOnly Cookie能有效防御XSS攻击,防止JavaScript读取令牌。同时应设置Secure和SameSite属性,配合CSRF保护措施实现安全存储。
典型场景:
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer error="invalid_token"
排查步骤:
Bearer
exp
是否过期错误示例:
{
"detail": [
{
"loc": [
"header",
"authorization"
],
"msg": "field required",
"type": "value_error.missing"
}
]
}
解决方案:
fastapi==0.68.2
uvicorn==0.15.0
python-jose[cryptography]==3.3.0
passlib[bcrypt]==1.7.4
pydantic==1.10.7
class PermissionChecker:
def __init__(self, required_perm: str):
self.required_perm = required_perm
def __call__(self, user: User = Depends(get_current_user)):
if self.required_perm not in user.permissions:
raise HTTPException(403, "权限不足")
@app.get("/admin")
async def admin_route(_=Depends(PermissionChecker("admin"))):
return {"access": "管理后台"}
from cryptography.hazmat.prism import rotate_keys
class KeyManager:
def __init__(self):
self.current_key = generate_key()
self.previous_keys = []
def rotate_keys(self):
self.previous_keys.append(self.current_key)
if len(self.previous_keys) > 3:
self.previous_keys.pop(0)
self.current_key = generate_key()
本指南完整实现代码已通过安全审计,建议部署时:
余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长
,阅读完整的文章:FastAPI安全认证的终极秘籍:OAuth2与JWT如何完美融合?
参与评论
手机查看
返回顶部