 
 
扫描二维码
关注或者微信搜一搜:编程智域 前端至全栈交流与成长
发现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如何完美融合?
 登录查看全部
登录查看全部
                参与评论
手机查看
返回顶部