MSAL重定向URI不匹配及会话数据损坏问题求助
我正在开发一个自托管Django Web应用,使用identity库(MSAL的封装库)获取OAuth令牌,通过MSGraph API访问租户资源。
我下载了官方示例应用,按指引在Azure AD租户中完成应用授权,设置重定向URI为http://localhost:8080/redirect。
启动本地应用时出现以下错误日志:
Django version 5.0.3, using settings 'mysite.settings' Starting development server at http://127.0.0.1:8080/ Quit the server with CONTROL-C. Session data corrupted redirect_uri mismatch: configured = http://localhost:8080/redirect, calculated = http://127.0.0.1:8080/redirect [26/Mar/2024 10:53:19] "GET / HTTP/1.1" 200 715
尝试将Azure AD中的重定向URI改为http://127.0.0.1:8080/redirect,但无法操作(对应截图:
)。
之后尝试用ngrok建立隧道,应用能正常加载登录页(截图:
),但日志再次出现URI不匹配:
Session data corrupted redirect_uri mismatch: configured = https://6ae1-89-64-xx-xx.ngrok-free.app/redirect, calculated = http://6ae1-89-64-xx-xx.ngrok-free.app/redirect [26/Mar/2024 10:34:47] "GET / HTTP/1.1" 200 730 Not Found: /favicon.ico
注:日志中calculated的URI丢失了https的"s",输入凭据后会跳转到错误页(截图:
)。
环境信息:
- Python 3.10.5
- 依赖版本:
Django==5.0.3 identity==0.6.0 msal==1.28.0
我的疑问:
http://localhost:8080/redirect与http://127.0.0.1:8080/redirect不相等?这是bug还是有特殊设计?- MSAL为何会从重定向URI中去掉https的"s"?
- 如何解决这些问题?
1. localhost与127.0.0.1的URI是否相等?
OAuth2协议要求重定向URI必须完全精确匹配,localhost和127.0.0.1是不同的主机标识——哪怕它们指向同一本地地址,也会被视为不同的URI,这是OAuth2的安全设计,不是bug。Azure AD严格遵循这一规则,所以两者无法互相替代。
你无法修改Azure AD中的URI,大概率是因为该URI已被应用的其他配置(比如不同平台的客户端)占用,或者你没有足够权限修改应用注册信息。
2. MSAL为何丢失https的"s"?
这是因为Django开发服务器默认以HTTP模式运行,ngrok虽提供HTTPS隧道,但Django本身不知道外部的HTTPS协议,导致MSAL从Django获取的请求协议是HTTP,最终生成的重定向URI也变成了HTTP。本质是Django开发环境没正确识别外部的HTTPS代理。
3. 解决方法
针对两个问题分别处理:
处理localhost/127.0.0.1不匹配
- 强制Django用localhost启动:启动开发服务器时指定绑定localhost,而非默认的127.0.0.1,命令如下:
这样Django生成的重定向URI会和Azure AD中配置的python manage.py runserver localhost:8080http://localhost:8080/redirect一致,解决不匹配问题。
处理ngrok下HTTPS丢失
- 让Django识别HTTPS代理:在Django的
settings.py中添加以下配置,告诉Django信任ngrok的代理头,从而正确识别外部的HTTPS协议:
同时,启动ngrok时确保转发到正确的本地端口(比如8080),命令示例:SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') USE_X_FORWARDED_HOST = True
之后在Azure AD中更新重定向URI为ngrok提供的HTTPS地址(比如ngrok http 8080https://xxxx.ngrok-free.app/redirect),这样MSAL生成的重定向URI就会带上https。
另外,如果你还是无法修改Azure AD的重定向URI,检查应用注册的权限(确保你是应用所有者或有修改权限),或者尝试添加新的重定向URI条目,而非修改现有条目。
内容的提问来源于stack exchange,提问作者EmEs

