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
相关产品推荐
相关产品推荐

