2017-09-04 21 views
6

Trong tài liệu góc, được đề cập rằng góc httpclient sẽ tự động gửi giá trị của cookie XSRF-TOKEN trong tiêu đề X-XSRF-TOKEN của yêu cầu bài đăng. Documentation linkangular4 httpclient csrf không gửi x-xsrf-token

Nhưng nó không gửi tiêu đề cho tôi. Đây là mã của tôi

Nodejs mã để thiết lập cookie

router.get('/set-csrf',function(req,res,next){ 
    res.setHeader('Set-Cookie', "XSRF-TOKEN=abc;Path=/; HttpOnly; SameSite=Strict");  
    res.send(); 
    }) 

Tôi đã sử dụng các httpclient trong app.module.ts

imports: [ 
    HttpClientModule 
] 

** Đoạn mã trên chỉ dành cho debug mục đích. Tôi không có điểm cuối tập hợp csrf.

Nhưng nó không gửi bất kỳ tiêu đề nào khi tôi gửi yêu cầu bài đăng. Tôi không thể gỡ lỗi.

Tôi cũng đã thêm sự cố trong kho lưu trữ github của góc cạnh. HttpXsrfInterceptor sẽ kiểm tra nếu yêu cầu là GET hoặc HEAD, hoặc nếu nó bắt đầu bằng http. Nếu đúng, nó bỏ qua thêm tiêu đề.

Đây là mã trong HttpXsrfInterceptor class

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { 
    const lcUrl = req.url.toLowerCase(); 
    // Skip both non-mutating requests and absolute URLs. 
    // Non-mutating requests don't require a token, and absolute URLs require special handling 
    // anyway as the cookie set 
    // on our origin is not the same as the token expected by another origin. 
    if (req.method === 'GET' || req.method === 'HEAD' || lcUrl.startsWith('http://') || 
     lcUrl.startsWith('https://')) { 
     return next.handle(req); 
    } 
    const token = this.tokenService.getToken(); 

    // Be careful not to overwrite an existing header of the same name. 
    if (token !== null && !req.headers.has(this.headerName)) { 
     req = req.clone({headers: req.headers.set(this.headerName, token)}); 
    } 
    return next.handle(req); 
    } 

Tôi không chắc chắn lý do tại sao họ đã bỏ qua cho http/s phần. Đây là số issue in github

+0

Bạn có sử dụng yêu cầu CORS không? – Alexandr

+0

Tôi đang thêm tiêu đề '" Access-Control-Allow-Headers "," * "' – netuser

+1

Tôi đã thấy sự cố của bạn. Dường như với tôi rằng góc nên xử lý các liên kết http theo cách khác nhau. Ví dụ: lưu trữ mã thông báo csrf cuối cùng cho mỗi tên miền riêng biệt. Có lẽ nó là tốt để làm cho một tời Interceptor xử lý csrf theo cách như vậy? – Alexandr

Trả lời

8

Những gì bạn đang tìm kiếm là HttpClientXsrfModule.

Vui lòng đọc thêm tại đây: https://angular.io/api/common/http/HttpClientXsrfModule.

sử dụng của bạn nên được như thế này:

imports: [ 
HttpClientModule, 
HttpClientXsrfModule.withConfig({ 
    cookieName: 'My-Xsrf-Cookie', // this is optional 
    headerName: 'My-Xsrf-Header' // this is optional 
}) 
] 

Ngoài ra, nếu mã của bạn nhắm API thông qua URL tuyệt đối, mặc định CSRF đánh chặn sẽ không làm việc ra khỏi hộp. Thay vào đó bạn phải thực hiện đánh chặn riêng của bạn mà không bỏ qua các tuyến đường tuyệt đối.

@Injectable() 
export class HttpXsrfInterceptor implements HttpInterceptor { 

    constructor(private tokenExtractor: HttpXsrfTokenExtractor) { 
    } 

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { 
    const headerName = 'X-XSRF-TOKEN'; 
    let token = this.tokenExtractor.getToken() as string; 
    if (token !== null && !req.headers.has(headerName)) { 
     req = req.clone({ headers: req.headers.set(headerName, token) }); 
    } 
    return next.handle(req); 
    } 
} 

Và cuối cùng thêm nó vào các nhà cung cấp của bạn:

providers: [ 
    { provide: HTTP_INTERCEPTORS, useClass: HttpXsrfInterceptor, multi: true } 
] 
+0

Nó sẽ thêm mã thông báo CSRF cho tất cả các yêu cầu hoặc chỉ yêu cầu thay đổi dữ liệu (POST, PUT, DELETE)? – dzejdzej

+0

Bạn nhận được mã thông báo CSRF bằng GET, vì vậy ngay cả khi bạn không chuyển nó, GET sẽ trả lại cho bạn (tất nhiên với sự tôn trọng xác thực người dùng) và từ đó mọi yêu cầu sẽ mang nó - kể từ POST, PUT, DELETE, PATCH đang thay đổi dữ liệu, có CSRF là rất quan trọng. –

+0

Điều tôi muốn nói là với mã bạn cung cấp tất cả các yêu cầu sẽ có bộ mã thông báo, thậm chí là yêu cầu GET. Tôi không nghĩ rằng đó là dự định mặc dù. – dzejdzej

0

Tôi cho rằng phương pháp đúng là withOptions. Tôi đã sử dụng withConfig và gặp lỗi Property 'withConfig' does not exist on type 'typeof HttpClientXsrfModule'. Đây là vấn đề đánh máy trong tài liệu. Bạn cần sử dụng "withOptions" thay vì HttpClientXsrfModule.withOptions({ cookieName: 'My-Xsrf-Cookie', headerName: 'My-Xsrf-Header', })

Các vấn đề liên quan