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

Angular 5中SSO认证失败:缺失Access-Control-Allow-Origin请求头

解决EVE Online SSO获取Access Token的POST请求问题

我帮你梳理下当前代码里的几个关键问题,这些应该就是你卡壳6天的核心原因:

1. Interceptor加错了请求头,完全无效

你在Interceptor里设置的Access-Control-Allow-Origin是服务器返回给浏览器的响应头,根本不是客户端需要发送的请求头!浏览器会自动处理跨域相关的校验,手动加这个头不仅帮不上忙,反而可能干扰正常的CORS流程。

如果暂时不需要其他拦截逻辑,你可以直接简化这个Interceptor(甚至先删掉它,先搞定核心请求):

import { Injectable, NgModule } from "@angular/core";
import { HttpInterceptor, HttpRequest, HttpEvent, HTTP_INTERCEPTORS, HttpHandler } from "@angular/common/http";
import { Observable } from "rxjs";

@Injectable()
export class HttpRequestInteceptor implements HttpInterceptor {
  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    // 移除错误的Access-Control-Allow-Origin设置
    const dupReq = req.clone();
    return next.handle(dupReq);
  }
};

@NgModule({
  providers: [
    { provide: HTTP_INTERCEPTORS, useClass: HttpRequestInteceptor, multi: true }
  ]
})
export class InterceptorModule { }

2. HttpParams使用错误,导致POST请求体为空

HttpParams是不可变对象,调用set()方法会返回一个新的实例,而不是修改原对象。你现在的代码只是调用了body.set()但没有赋值,最终发送的请求体是空的——API肯定不会给你返回Token!

同时,EVE SSO要求的grant_type是authorization_code,不是你写的authorization,这个参数错误直接会被API拒绝。修改你的服务方法:

exchangeAuthForToken(authCode: string){
  // 正确构建HttpParams:链式调用set,或者每次赋值新实例
  const body = new HttpParams()
    .set('grant_type', 'authorization_code')
    .set('code', authCode);

  const httpOptions = {
    headers: new HttpHeaders()
      .set('Content-Type', 'application/x-www-form-urlencoded')
      .set('Authorization', 'Basic MDBiNzU0NTQwODllNGE1ZGFiODcwY2UzNzBlN2ExNTI6SmZLKF14RmpzMno2M248MSR0NEJDbi9dQ3JGbG1B')
  };

  return this.http.post(tokenPOSTUrl, body, httpOptions);
}

3. 额外需要检查的细节

  • 确认你的client_id_val已经正确赋值,且Authorization头里的Basic凭证是用client_id:client_secret做Base64编码得到的(注意冒号是分隔符)。
  • 确认你的redirect_uri和EVE开发者后台里配置的完全一致——包括协议(http/https)、域名、路径,任何差异都会导致授权码无效。
  • 打开浏览器开发者工具的Network面板,查看POST请求的详情:
    • 检查Request Headers里的Content-Type和Authorization是否正确
    • 查看Payload里是否包含grant_type=authorization_code和code=你的授权码
    • 看API返回的错误信息(比如400 Bad Request会告诉你具体哪里错了,比如invalid_grant或者missing parameters)

先把这几个问题修正,应该就能拿到Access Token了!


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:27:31