向OPTIONS请求添加身份验证

时间:2016-11-21 14:38:10

标签: api angular cors token jwt

如何向针对跨域API的OPTIONS请求添加标头?

我正在使用的API需要在所有请求中将JWT标记设置为Authorization标头。

当我尝试访问API Angular时,首先执行OPTIONS请求,该请求不关心我为“真实”请求设置的标头,如下所示:

this._headers = new Headers({
    'Content-Type': 'application/x-www-form-urlencoded',
    'Authorization': 'Bearer my-token-here'
});

return this._http
            .post(AppConfig.apiUrl + 'auth/logout', params, {headers: this._headers})
            ...
            ...

如果未提供令牌,则API返回HTTP状态401,Angular认为OPTIONS请求失败。

2 个答案:

答案 0 :(得分:22)

根据CORS specification when a preflight request执行的用户凭据被排除在外。

  

(...)使用方法OPTIONS,并具有以下附加约束:

     
      
  • (...)
  •   
  • 排除作者请求标题。
  •   
  • 排除用户凭据。
  •   
  • (...)
  •   

(重点是我的)

考虑到这一点,问题似乎出现在API方面,应该接受OPTIONS请求而不需要身份验证

答案 1 :(得分:-1)

可以使用 withCredentials 选项为 CORS 预检请求提供身份验证:

@Injectable()
export class AuthInterceptor implements HttpInterceptor {
  constructor() {
  }

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    request = request.clone({
      withCredentials: true
    });
    return next.handle(request);
  }
}

另见:

https://stackoverflow.com/a/38615675/166850