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)
- 检查Request Headers里的
先把这几个问题修正,应该就能拿到Access Token了!
内容的提问来源于stack exchange,提问作者BenjaminApprill
相关产品推荐
相关产品推荐

