FastAPI JWT刷新令牌:安全存储的完整指南
FastAPI JWT刷新令牌安全存储的完整指南【免费下载链接】fastapiFastAPI framework, high performance, easy to learn, fast to code, ready for production项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi在前100个字内FastAPI JWT刷新令牌是构建现代Web应用身份验证系统的关键组件。FastAPI框架提供了高效、安全的JWT刷新令牌实现方案让开发者能够轻松管理用户会话和访问控制。本文将深入探讨FastAPI中JWT刷新令牌的安全存储策略帮助您构建更加安全可靠的API应用。为什么需要JWT刷新令牌JWTJSON Web Token是现代Web应用中最流行的身份验证机制之一但访问令牌通常有较短的有效期如30分钟。刷新令牌允许用户在访问令牌过期后获取新的访问令牌而无需重新登录提供更好的用户体验。在FastAPI中实现JWT刷新令牌时安全存储是至关重要的环节。不当的存储方式可能导致令牌泄露进而危及整个系统的安全。FastAPI JWT刷新令牌基础实现FastAPI提供了完善的OAuth2安全模块支持JWT令牌的生成和验证。以下是创建访问令牌的基本实现from datetime import datetime, timedelta, timezone import jwt from fastapi import FastAPI, HTTPException, status from fastapi.security import OAuth2PasswordBearer SECRET_KEY your-secret-key-here ALGORITHM HS256 ACCESS_TOKEN_EXPIRE_MINUTES 30 REFRESH_TOKEN_EXPIRE_DAYS 7 def create_access_token(data: dict, expires_delta: timedelta | None None): to_encode data.copy() if expires_delta: expire datetime.now(timezone.utc) expires_delta else: expire datetime.now(timezone.utc) timedelta(minutes15) to_encode.update({exp: expire}) encoded_jwt jwt.encode(to_encode, SECRET_KEY, algorithmALGORITHM) return encoded_jwt def create_refresh_token(data: dict): to_encode data.copy() expire datetime.now(timezone.utc) timedelta(daysREFRESH_TOKEN_EXPIRE_DAYS) to_encode.update({exp: expire, type: refresh}) encoded_jwt jwt.encode(to_encode, SECRET_KEY, algorithmALGORITHM) return encoded_jwt刷新令牌的安全存储策略1. HTTP-Only Cookies存储将刷新令牌存储在HTTP-Only Cookie中是最推荐的安全存储方式。这种方式可以有效防止XSS攻击from fastapi import Response app.post(/refresh) async def refresh_token(response: Response, refresh_token: str Cookie(None)): # 验证刷新令牌 # 生成新的访问令牌 # 设置HTTP-Only Cookie response.set_cookie( keyrefresh_token, valuenew_refresh_token, httponlyTrue, secureTrue, # 仅HTTPS samesitestrict, max_age7*24*60*60 # 7天 ) return {access_token: new_access_token}2. Redis数据库存储对于需要分布式支持的应用程序Redis是理想的刷新令牌存储方案import redis from datetime import timedelta redis_client redis.Redis(hostlocalhost, port6379, db0) async def store_refresh_token(user_id: str, token: str): # 存储刷新令牌设置过期时间 redis_client.setex( frefresh_token:{user_id}, timedelta(days7), token ) async def validate_refresh_token(user_id: str, token: str) - bool: stored_token redis_client.get(frefresh_token:{user_id}) return stored_token and stored_token.decode() token3. 数据库存储方案如果您的应用已经使用数据库可以将刷新令牌存储在用户表中from sqlalchemy import Column, String, DateTime from sqlalchemy.ext.declarative import declarative_base from datetime import datetime, timedelta Base declarative_base() class UserRefreshToken(Base): __tablename__ user_refresh_tokens user_id Column(String, primary_keyTrue) refresh_token Column(String, nullableFalse) expires_at Column(DateTime, nullableFalse) created_at Column(DateTime, defaultdatetime.utcnow)完整的FastAPI刷新令牌实现以下是一个完整的FastAPI刷新令牌端点实现示例from fastapi import APIRouter, Depends, HTTPException, status from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm from pydantic import BaseModel router APIRouter() oauth2_scheme OAuth2PasswordBearer(tokenUrltoken) class TokenResponse(BaseModel): access_token: str refresh_token: str token_type: str bearer router.post(/token, response_modelTokenResponse) async def login_for_access_token( form_data: OAuth2PasswordRequestForm Depends() ): # 验证用户凭据 user authenticate_user(form_data.username, form_data.password) if not user: raise HTTPException( status_codestatus.HTTP_401_UNAUTHORIZED, detailIncorrect username or password ) # 创建访问令牌和刷新令牌 access_token create_access_token(data{sub: user.username}) refresh_token create_refresh_token(data{sub: user.username}) # 安全存储刷新令牌 await store_refresh_token_safely(user.id, refresh_token) return TokenResponse( access_tokenaccess_token, refresh_tokenrefresh_token ) router.post(/refresh, response_modelTokenResponse) async def refresh_access_token(refresh_token: str): # 验证刷新令牌 payload jwt.decode(refresh_token, SECRET_KEY, algorithms[ALGORITHM]) if payload.get(type) ! refresh: raise HTTPException( status_codestatus.HTTP_401_UNAUTHORIZED, detailInvalid token type ) user_id payload.get(sub) if not await validate_stored_refresh_token(user_id, refresh_token): raise HTTPException( status_codestatus.HTTP_401_UNAUTHORIZED, detailInvalid refresh token ) # 生成新的令牌对 new_access_token create_access_token(data{sub: user_id}) new_refresh_token create_refresh_token(data{sub: user_id}) # 更新存储的刷新令牌 await update_refresh_token(user_id, new_refresh_token) return TokenResponse( access_tokennew_access_token, refresh_tokennew_refresh_token )安全最佳实践令牌轮换机制每次使用刷新令牌获取新的访问令牌时应该同时生成新的刷新令牌并作废旧的。这种机制可以防止令牌重用攻击async def rotate_refresh_token(user_id: str, old_token: str, new_token: str): # 验证旧令牌 if not await validate_refresh_token(user_id, old_token): raise HTTPException(status_code401, detailInvalid refresh token) # 作废旧令牌 await revoke_refresh_token(user_id, old_token) # 存储新令牌 await store_refresh_token(user_id, new_token)令牌黑名单实现令牌黑名单机制允许主动撤销令牌class TokenBlacklist: def __init__(self): self.blacklisted_tokens set() def add(self, token: str): self.blacklisted_tokens.add(token) def is_blacklisted(self, token: str) - bool: return token in self.blacklisted_tokens # 在令牌验证时检查黑名单 def verify_token_not_blacklisted(token: str) - bool: return not token_blacklist.is_blacklisted(token)部署和监控部署FastAPI应用时确保刷新令牌存储系统的高可用性。使用Redis集群或数据库复制来保证服务连续性。测试和验证在FastAPI中测试刷新令牌功能时可以使用内置的TestClientfrom fastapi.testclient import TestClient def test_refresh_token_flow(): client TestClient(app) # 1. 获取初始令牌 login_response client.post(/token, data{ username: testuser, password: testpass }) assert login_response.status_code 200 refresh_token login_response.json()[refresh_token] # 2. 使用刷新令牌获取新访问令牌 refresh_response client.post(/refresh, json{ refresh_token: refresh_token }) assert refresh_response.status_code 200 # 3. 验证新令牌有效 new_access_token refresh_response.json()[access_token] headers {Authorization: fBearer {new_access_token}} protected_response client.get(/protected, headersheaders) assert protected_response.status_code 200常见问题解决令牌泄露处理如果发现刷新令牌泄露立即执行以下操作将该用户的所有令牌加入黑名单强制用户重新登录通知用户更改密码性能优化对于高并发应用考虑以下优化策略使用内存缓存存储活跃令牌实现令牌预刷新机制批量处理令牌验证请求总结FastAPI JWT刷新令牌的安全存储是实现健壮身份验证系统的关键。通过HTTP-Only Cookies、Redis或数据库存储结合令牌轮换和黑名单机制您可以构建既安全又用户友好的认证流程。记住安全是一个持续的过程。定期审查和更新您的令牌管理策略保持对最新安全威胁的了解确保您的FastAPI应用始终保持最高级别的安全性。通过本文介绍的FastAPI JWT刷新令牌安全存储方案您现在已经掌握了构建安全身份验证系统的关键技能。开始实施这些最佳实践让您的应用更加安全可靠【免费下载链接】fastapiFastAPI framework, high performance, easy to learn, fast to code, ready for production项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2459487.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!