Angular-oauth2-oidc中如何将loadDiscoveryDocument的请求改为POST方法
解决方案
loadDiscoveryDocument 是OIDC认证生态中用于拉取开放ID发现文档的通用方法,OIDC核心规范明确规定发现端点的请求必须使用GET方法,因此绝大多数主流OIDC库默认仅支持GET请求拉取发现文档。如果你的认证服务端属于非标准实现、强制要求POST请求拉取发现文档,可参考对应库的自定义配置方案修改:
场景1:使用angular-oauth2-oidc库
可通过自定义HttpInterceptor拦截发现文档请求,匹配到对应端点时修改请求方法为POST,示例代码如下:
@Injectable() export class DiscoveryRequestInterceptor implements HttpInterceptor { intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { // 匹配你的OIDC发现文档端点地址 if (req.url.includes('.well-known/openid-configuration') && req.method === 'GET') { const modifiedReq = req.clone({ method: 'POST', // 按需补充POST要求的请求体、请求头 body: { requiredParam: 'yourValue' }, headers: req.headers.set('Content-Type', 'application/json') }); return next.handle(modifiedReq); } return next.handle(req); } }
修改完成后在对应模块的providers中注册该拦截器即可生效。
场景2:使用oidc-client-js/oidc-client-ts库
可通过传入自定义fetch方法实现请求方法修改:
import { UserManager } from 'oidc-client-ts'; const customFetch = (input, init) => { if (input.includes('.well-known/openid-configuration') && init.method === 'GET') { init.method = 'POST'; // 按需补充POST要求的请求体、请求头 init.body = JSON.stringify({ requiredParam: 'yourValue' }); init.headers['Content-Type'] = 'application/json'; } return window.fetch(input, init); }; const config = { authority: 'https://your-oidc-provider.com', client_id: 'your-client-id', // 传入自定义fetch覆盖默认逻辑 fetch: customFetch }; const userManager = new UserManager(config);
注意:非标准的POST请求拉取发现文档可能会导致后续OIDC流程出现兼容问题,建议优先确认服务端是否可以支持标准GET请求拉取发现文档。
你提到的无需输入用户名密码获取Token的场景,属于客户端凭证流、刷新令牌流等授权流的范畴,和发现文档的请求方法没有直接关联,拉取到发现文档后调用对应库的对应授权流方法即可完成Token获取。
内容的提问来源于stack exchange,提问作者Senthil
相关产品推荐
相关产品推荐

