2017-02-01 62 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所述,具体取决于您要允许的域/子域。