2017-02-01 64 views
0

我的後端發送的csrf cookie似乎被瀏覽器忽略。忽略Set-Cookie標頭

Request and Response

的請求被經由角(2)從http://localhost.mydomain.com:4200製成像這樣:

get() { 
    let headers = new Headers({ 
    'Content-Type' : 'application/json', 
    'withCredentials' : true 
    }); 
    let options = new RequestOptions({headers : headers}); 
    return this.http.post('https://api.mydomain.com', { 
    o : 'csrf', 
    m : 'get', 
    p : {} 
    }, options) 
    .map((res: Response) => { 
     console.log('response received: ', res) 
    }) 
    .catch((err: any) => { 
     console.log('error received: ', err); 
     return Observable.throw(err); 
    }); 
} 

該請求正在由AWS API網關/λ接收運行快速4.x和發送回as:

res.cookie('csrf', token, {domain : '.mydomain.com'}); 

在xhr響應中設置cookie應該沒問題。因爲請求和響應都是mydomain.com的子域名,所以我不應該需要withCredentials選項(儘管如圖所示,我試着發送它)。收到的響應和標題在那裏。這只是沒有設置。

它在Chrome,Firefox和IE瀏覽器被忽略,所以我敢肯定,問題是我缺少明顯的東西:)

+2

請注意,不同的子域被瀏覽器視爲交叉源,因此您需要withCredentials來處理所有對api的請求。 – charlietfl

+2

除了@charlietfl(正確)指出的內容外,'withCredentials'不是頭,而是[XMLHttpRequest'的屬性](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials)。 – robertklep

+0

D'oh!就是這樣。謝謝!! –

回答

0

對於任何人絆倒在這個@robertklep和正確@charliefl分別爲(謝謝!) 。寫我的請求,正確的方法是:

get() { 
    let headers = new Headers({ 
    'Content-Type' : 'application/json' 
    }); 
    let options = new RequestOptions({ 
    headers : headers, 
    withCredentials: true 
    }); 
    return this.http.post('https://api.mydomain.com', { 
    o : 'csrf', 
    m : 'get', 
    p : {} 
    }, options) 
    .map((res: Response) => { 
     console.log('response received: ', res) 
    }) 
    .catch((err: any) => { 
     console.log('error received: ', err); 
     return Observable.throw(err); 
    }); 
} 

此外,因爲我是想偷懶,我的服務器,然後我跑進了錯誤的使用在'Access-Control-Allow-Origin'通配符:

A wildcard '*' cannot be used in the 'Access-Control-Allow-Origin' header when the credentials flag is true 

如果您的多個域使用您的API,則必須在您的服務器上動態地設置'Access-Control-Allow-Origin',如herehere所述,具體取決於您要允許的域/子域。