Angular 4 - 在每个请求上设置 withCredentials - cors cookie

Posted

技术标签:

【中文标题】Angular 4 - 在每个请求上设置 withCredentials - cors cookie【英文标题】:Angular 4 - setting withCredentials on every request - cors cookie 【发布时间】:2018-04-28 12:44:19 【问题描述】:

我的 Angular 客户端与后端分离,并且我在后端启用了 cors,一切正常,除了我的身份验证失败,因为 cookie 未添加到请求中。

在网上搜索后发现我应该在每个http请求上设置withCredentials : true。我设法在一个请求上做到了,它可以工作,但不是所有的请求。

我尝试使用 BrowserXhr How to send "Cookie" in request header for all the requests in Angular2?,但它不起作用,而且它也已被弃用 afaik。

我也尝试过 RequestOptions,但没有成功。

如何在每个 http 请求上设置 withCredentials: true

稍后编辑:

@Injectable()
export class ConfigInterceptor implements HttpInterceptor 

  constructor(private csrfService: CSRFService) 

  

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> 
    let token = this.csrfService.getCSRF() as string;
    const credentialsReq = req.clone(withCredentials : true, setHeaders:  "X-XSRF-TOKEN": token  );
    return next.handle(credentialsReq);
  

【问题讨论】:

我添加了对 mea 有效的代码 见我的example 【参考方案1】:

您可以使用HttpInterceptor

@Injectable()
export class CustomInterceptor implements HttpInterceptor 

    constructor() 
    

    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> 

        request = request.clone(
            withCredentials: true
        );

        return next.handle(request);
    

接下来你必须提供它:

@NgModule(
  bootstrap: [AppComponent],
  imports: [...],
  providers: [
    
      provide: HTTP_INTERCEPTORS,
      useClass: CustomInterceptor ,
      multi: true
    
  ]
)
export class AppModule 

Source and full explanation

【讨论】:

请avoid link only answers。答案“仅仅是指向外部网站的链接”may be deleted。 @Quentin 道歉,我用代码示例更新了我的答案。 请注意,这只适用于使用@angular/common/http 的请求,而不是使用@angular/http。 这似乎只适用于获取请求,关于 post 和 put 的任何建议? @MGDavies HttpInterceptor 不仅限于GET 请求,还应该适用于POSTPUT【参考方案2】:

另一种可能更简单的方法是创建自己的ApiService。它将使用注入的HttpClient。所有 XHR 请求都将直接使用 ApiService 而不是 HttpClient。

这是一个示例实现:

https://github.com/gothinkster/angular-realworld-example-app/blob/63f5cd879b5e1519abfb8307727c37ff7b890d92/src/app/core/services/api.service.ts

我修改的部分代码:

@Injectable()
export class ApiService 

  private httpOptions = 
    headers: new HttpHeaders( 'Content-Type': 'application/json' ),
    withCredentials: true // to allow cookies to go from "https://localhost:4567" to "http://localhost:5678"
  ;

  constructor(
    private http: HttpClient
  )  

  private formatErrors(error: any) 
    return throwError(error.error);
  

  get(path: string, params: HttpParams = new HttpParams()): Observable<any> 
    return this.http.get(`$environment.api_url$path`,  params )
      .pipe(catchError(this.formatErrors));
  

  put(path: string, body: Object = ): Observable<any> 
    return this.http.put(
      `$environment.api_url$path`,
      JSON.stringify(body),
      this.httpOptions
    ).pipe(catchError(this.formatErrors));
  

  post(path: string, body: Object = ): Observable<any> 
    return this.http.post(
      `$environment.api_url$path`,
      JSON.stringify(body),
      this.httpOptions
    ).pipe(catchError(this.formatErrors));
  

【讨论】:

以上是关于Angular 4 - 在每个请求上设置 withCredentials - cors cookie的主要内容,如果未能解决你的问题,请参考以下文章

在 Angular 4/5 中,是不是可以只预呈现来自 Facebook 和 Twitter 爬虫的请求,而不是预呈现每个请求

带有 .Get() 对 Azure 搜索 API 的请求的 Angular HttpClient“未知错误”

每个 http 请求上的 Angular 2 加载器

如何使用 Angular 2 在 POST 上启用 ASP.NET MVC 4 中的跨源请求

Angular 4 - 请求的资源上不存在“Access-Control-Allow-Origin”标头

Docker 和身份服务器 4、api、angular:无法分配请求的地址