ReactJS前端经Azure AD认证后调用Django Rest接口返回invalid token问题排查
配置排查及解决方案清单
1. 前端令牌获取逻辑校验
- 调用MSAL的
acquireTokenSilent/acquireTokenPopup接口请求令牌时,传入的scope必须是Django应用注册暴露的完整权限路径,格式为api://<Django应用注册客户端ID>/<自定义scope名称>,不能仅传入scope名称,也不能混用前端自身权限、Graph API权限。 - 确认你放在
Authorization请求头里的是*访问令牌(Access Token)*而非ID令牌:ID令牌仅用于前端自身身份校验,无法通过后端API的认证。你可以将令牌粘贴到jwt.io解析,确认aud(受众)字段的值为Django应用注册的客户端ID或应用ID URI,而非前端应用的客户端ID。 - 校验令牌有效期:解析后查看
exp字段的时间戳,确认请求时令牌未过期。
2. Django侧认证配置校验
- 若使用
django-auth-adfs等Azure AD认证库,确认AUDIENCE配置项的值和令牌解析出的aud字段完全一致,不能误填为前端应用的客户端ID。 - 确认
TENANT_ID配置项为你的Azure AD租户实际ID,和令牌解析出的tid字段完全匹配,不可使用公共租户、错填租户ID。 - 若配置了
ISSUER参数,确认值和令牌解析出的iss字段完全一致:v1端点格式为https://sts.windows.net/<租户ID>/,v2端点格式为https://login.microsoftonline.com/<租户ID>/v2.0。
3. Azure AD应用注册配置校验
- 查看Django应用注册的「清单」配置,确认
accessTokenAcceptedVersion参数值和你前端请求的端点版本匹配:v1端点对应值为null或1,v2端点对应值为2,版本不匹配会直接导致签名校验失败。 - 确认前端应用注册的「API权限」页中,添加的Django自定义scope授权状态为「已授予<你的租户名称>」,如果是需要管理员同意的权限,必须由租户管理员完成授权,仅用户级授权无法生成有效访问令牌。
- 排除Django应用注册配置了IP限制、条件访问策略的可能,这类规则会导致合法令牌被拦截。
4. 快速定位方法
复制前端拿到的完整Bearer Token,直接用Postman等工具携带该令牌请求Django接口:
- 若Postman同样返回
invalid token,说明问题出在令牌本身或Django的认证配置,无需排查前端请求逻辑- 若Postman请求成功,说明是前端请求头格式错误,确认
Authorization头格式为Bearer <令牌值>,Bearer和令牌值之间有且仅有一个空格,无多余换行、特殊字符。
内容的提问来源于stack exchange,提问作者Jessin
相关产品推荐
相关产品推荐

