部署到IIS生产服务器后Django Rest Framework的JWT认证失效
IIS部署DRF API后JWT认证失效的排查方案
1. 核对SimpleJWT核心配置
- 确保生产环境
settings.py中的SECRET_KEY为独立安全密钥(可与本地不同,但需保证签名逻辑一致),SimpleJWT默认使用该密钥签名Token,密钥不匹配会直接导致认证失败。 - 检查
SIMPLE_JWT配置项是否完整,示例参考:from datetime import timedelta SIMPLE_JWT = { 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5), 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), 'ALGORITHM': 'HS256', 'SIGNING_KEY': SECRET_KEY, 'AUTH_HEADER_TYPES': ('Bearer',), 'AUTH_HEADER_NAME': 'HTTP_AUTHORIZATION', } - 确认生产环境已安装对应版本的
djangorestframework-simplejwt,执行pip list核对版本与本地一致,避免版本兼容问题。
2. 修复IIS请求头传递问题
IIS默认可能拦截或篡改Authorization请求头,需在web.config中添加配置确保头信息正常传递:
<system.webServer> <rewrite> <rules> <rule name="Preserve Authorization Header" stopProcessing="true"> <match url=".*" /> <conditions> <add input="{HTTP_AUTHORIZATION}" pattern="^(Bearer .+)$" /> </conditions> <serverVariables> <set name="HTTP_AUTHORIZATION" value="{C:0}" /> </serverVariables> </rule> </rules> </rewrite> </system.webServer>
注意:需先在IIS中启用URL重写模块,若未安装需通过服务器管理器添加该组件。
3. 校验wfastcgi部署配置
检查web.config中的wfastcgi参数是否正确:
<appSettings> <add key="WSGI_HANDLER" value="django.core.wsgi.get_wsgi_application()" /> <add key="PYTHONPATH" value="D:\your_project_root" /> <add key="DJANGO_SETTINGS_MODULE" value="your_project.settings" /> </appSettings> <system.webServer> <handlers> <add name="Python FastCGI" path="*" verb="*" modules="FastCgiModule" scriptProcessor="C:\Python39\python.exe|C:\Python39\Lib\site-packages\wfastcgi.py" resourceType="Unspecified" requireAccess="Script" /> </handlers> </system.webServer>
- 确保
PYTHONPATH指向Django项目根目录,DJANGO_SETTINGS_MODULE对应正确的settings文件路径。 - 生产环境建议使用虚拟环境,避免全局Python包冲突,需将
scriptProcessor中的Python路径改为虚拟环境的python.exe路径。
4. 日志定位具体错误
在生产环境settings.py中配置日志,捕获JWT认证相关错误:
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'api_log': { 'level': 'DEBUG', 'class': 'logging.FileHandler', 'filename': 'D:\logs\api_errors.log', 'formatter': 'verbose', }, }, 'formatters': { 'verbose': { 'format': '{levelname} {asctime} {module} {message}', 'style': '{', }, }, 'loggers': { 'rest_framework_simplejwt': { 'handlers': ['api_log'], 'level': 'DEBUG', 'propagate': True, }, 'django.request': { 'handlers': ['api_log'], 'level': 'DEBUG', 'propagate': True, }, }, }
查看日志文件,重点关注Invalid token、Authorization header not found等关键词,定位具体失败原因。
5. 验证请求头是否到达后端
新增测试视图,确认Authorization头是否被正确传递到Django:
from rest_framework.views import APIView from rest_framework.response import Response class AuthHeaderCheckView(APIView): def get(self, request): auth_header = request.META.get('HTTP_AUTHORIZATION') return Response({'received_auth_header': auth_header})
部署后用Postman请求该接口,若返回null或空值,说明IIS未传递请求头,需重新检查URL重写配置。
内容的提问来源于stack exchange,提问作者Parth Panchal
相关产品推荐
相关产品推荐

