You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,但无法操作(对应截图:无法修改重定向URI)。

之后尝试用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

我的疑问:

  1. http://localhost:8080/redirect与http://127.0.0.1:8080/redirect不相等?这是bug还是有特殊设计?
  2. MSAL为何会从重定向URI中去掉https的"s"?
  3. 如何解决这些问题?

问题解答

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,命令如下:
    python manage.py runserver localhost:8080
    
    这样Django生成的重定向URI会和Azure AD中配置的http://localhost:8080/redirect一致,解决不匹配问题。

处理ngrok下HTTPS丢失

  • 让Django识别HTTPS代理:在Django的settings.py中添加以下配置,告诉Django信任ngrok的代理头,从而正确识别外部的HTTPS协议:
    SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
    USE_X_FORWARDED_HOST = True
    
    同时,启动ngrok时确保转发到正确的本地端口(比如8080),命令示例:
    ngrok http 8080
    
    之后在Azure AD中更新重定向URI为ngrok提供的HTTPS地址(比如https://xxxx.ngrok-free.app/redirect),这样MSAL生成的重定向URI就会带上https。

另外,如果你还是无法修改Azure AD的重定向URI,检查应用注册的权限(确保你是应用所有者或有修改权限),或者尝试添加新的重定向URI条目,而非修改现有条目。


内容的提问来源于stack exchange,提问作者EmEs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 09:53:16