2017-09-04 19 views
6

Köşeli belgede, açısal httpclient açmanın otomatik olarak XSRF-TOKEN çerezinin değerini posta isteğinin üstbilgisinde X-XSRF-TOKEN başlığında göndereceği belirtiliyor. Documentation linkangular4 httpclient csrf x-xsrf-token göndermiyor

Ancak, başlık benim için gönderilmez. İşte çerez

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

ayarlamak için

Nodejs kod ben app.module.ts içinde httpclient kullandık benim kodudur

imports: [ 
    HttpClientModule 
] 

** Yukarıdaki kod sadece ayıklama içindir amaç. Set-csrf uç noktam yok.

Ancak posta isteği gönderdiğimde herhangi bir başlık göndermiyor. Hata ayıklayamıyorum.

Sorunu, açısal github deposuna da ekledim. HttpXsrfInterceptor, isteğin GET veya HEAD olup olmadığını veya http ile başladığını kontrol eder. Doğruysa, üstbilgiyi ekleyerek atlar. İşte

onlar http/s bölümü için atlanır neden emin değilim 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); 
    } 

yılında kodudur. İşte benim issue in github

+0

Bir CORS isteği kullanıyor musunuz? – Alexandr

+0

"Access-Control-Allow-Headers" başlıklarını ekliyorum, "*" ' – netuser

+1

Sorununuzu gördüm. Bana öyle geliyor ki açısal http [s] linklerini farklı şekilde işlemelidir. Örneğin, her alan için ayrı ayrı son csrf belirteci saklayın. Belki başka bir Interceptor vinçinin böyle bir şekilde csrf kullanması iyidir? – Alexandr

cevap

8

Şu anda ne arıyorsanız: HttpClientXsrfModule.

Daha fazla bilgiyi buradan okuyun: https://angular.io/api/common/http/HttpClientXsrfModule.

kullanımınız böyle olmalı: kodunuzu mutlak URL üzerinden API hedefliyorsa

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

Ayrıca, varsayılan CSRF önleme kutunun dışında çalışmaz. Bunun yerine, mutlak güzergâhları görmezden gelen kendi engelleyicinizi uygulamak zorundasınız.

@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); 
    } 
} 

Ve nihayet sağlayıcılara ekleyin:

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

CSRF belirtecini tüm isteklere veya yalnızca veri değiştiren isteklere (POST, PUT, DELETE) ekleyecek mi? – dzejdzej

+0

CSRF belirtecini GET ile elde edersiniz, bu nedenle iletmezseniz bile, GET sizin için döndürür (elbette kullanıcı kimlik doğrulamasıyla) ve oradan da her istekte onu taşıyacaktır - POST, PUT, DELETE, PATCH verileri değiştiriyor, CSRF var kritik. –

+0

Demek istediğim, tüm istekleri sağladığınız kodla, belirteç setine, hatta GET isteğine sahip olacaktır. Bunun bir amacı olduğunu sanmıyorum. – dzejdzej

0

Doğru yöntem withOptions olduğunu varsayalım. Config ile kullandım ve Property 'withConfig' does not exist on type 'typeof HttpClientXsrfModule'. hatası aldım. Bu, belgelerindeki bir yazım meselesidir. Bunun yerine "withOptions" kullanmanız gerekir HttpClientXsrfModule.withOptions({ cookieName: 'My-Xsrf-Cookie', headerName: 'My-Xsrf-Header', })