如何配置OpenIddict以GET方式返回授权码适配Postman OAuth2.0测试
问题根因
你遇到的403错误本质是Postman的公共回调地址https://oauth.pstmn.io/v1/callback由CloudFront托管,仅支持GET请求,而OpenIddict对授权码流默认使用form_post响应模式,会以POST请求将授权码提交到回调地址,因此被CloudFront拦截。
解决方案
第一步:调整OpenIddict服务端配置
在AddServer的配置块中,添加响应模式的支持配置,保留原有form_post模式兼容现有业务客户端,同时新增query模式适配Postman。
找到代码中flows配置的段落,添加以下两行配置:
// 保留原有form_post响应模式,兼容现有业务客户端 options.AllowFormPostResponseMode(); // 新增query响应模式支持,适配Postman等使用GET回调的测试工具 options.AllowQueryResponseMode();
修改后的flows配置段示例:
// flows options.AllowAuthorizationCodeFlow(); options.AllowRefreshTokenFlow(); options.AllowPasswordFlow(); options.AllowHybridFlow(); // implicit is used by postman options.AllowImplicitFlow(); // 新增响应模式配置 options.AllowFormPostResponseMode(); options.AllowQueryResponseMode();
如果你在客户端存储中针对单个客户端配置了允许的响应模式白名单,需要将query添加到Postman对应客户端的允许响应模式列表中。
第二步:调整Postman OAuth2配置
修改Postman中Auth URL的取值,在原有地址末尾添加response_mode=query参数,告知OpenIddict本次授权请求使用GET回调的响应模式。
修改后的Auth URL为:
https://localhost/oauth/OpenIdConnect/Authorize?response_mode=query
其他Postman配置保持不变即可。
验证
配置完成后重启授权服务,重新在Postman中触发OAuth2授权流程,此时授权完成后OpenIddict会以302跳转的方式将授权码作为URL参数附加到Postman回调地址后,不会再触发403错误,Postman可以正常拿到授权码并完成后续的令牌兑换流程。
注意:该配置不会影响现有业务客户端的正常使用,现有客户端请求时如果依旧指定
form_post响应模式,OpenIddict仍会按原有逻辑返回POST表单数据。
内容的提问来源于stack exchange,提问作者Chris Thompson

