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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 21:09:04