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

Flask中request.url无法获取微软Auth完整回调URL问题求解

问题根因

  • URL中#开头的部分叫片段标识符(Fragment),属于浏览器端专用内容,默认不会随HTTP请求发送到后端服务器,所以你用Flask的request对象无论如何都拿不到这部分内容,这是HTTP协议的标准规则。
  • 你当前拿到的code出现在fragment里,是因为你在构造授权URL时主动设置了response_mode=fragment,这个配置就是要求微软Identity平台把授权参数放到URL的片段部分返回。

解决方案

方案1:修改response_mode参数(推荐)

这是最简单的适配方案,直接把授权URL中的response_mode=fragment改为response_mode=query,微软就会把code、state等参数放到?后面的查询字符串中返回,后端直接用原有逻辑就能正常提取参数。
修改后的授权URL构造代码参考:

@app.route("/app/microsoft_signin",methods=['GET','POST'])
def microsoft_signin_():
    authorization_url = f'{MICROSOFT_CONFIG["MICROSOFT_AUTHORIZATION_URL"]}?client_id={MICROSOFT_CONFIG["MICROSOFT_CLIENT_ID"]}&response_type=code&redirect_uri={MICROSOFT_CONFIG["MICROSOFT_REDIRECT_URI"]}&response_mode=query&scope={MICROSOFT_CONFIG["MICROSOFT_SCOPE"]}&state=12345'
    return redirect(authorization_url)

回调视图中直接调用code = request.args.get("code")即可正常拿到参数。

方案2:保留fragment模式,前端中转处理

如果业务场景要求必须使用response_mode=fragment,可以通过前端JS读取fragment内容后再转发给后端,回调视图代码参考:

@app.route("/app/microsoft_signin/callback",methods=['POST','PUT','GET'])
def microsoft_signin_callback_():
    # 首次请求无code参数,返回前端处理脚本读取fragment
    if not request.args.get("code"):
        return """
        <script>
        const fragmentParams = window.location.hash.slice(1)
        window.location.replace(`${window.location.origin}${window.location.pathname}?${fragmentParams}`)
        </script>
        """
    # 前端中转跳转后即可正常获取参数
    code = request.args.get("code")
    state = request.args.get("state")
    # 后续执行令牌请求、登录逻辑即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 19:57:02