来自远程API的Set-Cookie无法正常工作

时间:2016-10-25 05:11:00

标签: javascript http express cookies

我目前正在进行需要使用httpOnly cookie的项目。该项目需要直接调用API。

让我们说它验证用户登录尝试的xxx.com/vx/auth/login。该端点将为客户端提供响应并设置cookie。像这样:

Set-Cookie:token=eyJ0b2tlbiI6ImV5SmhiR2NpT2lKSVV6STFOaUlzSW5SNWNDSTZJa3BYVkNKOS5leUoxYVdRaU9pSXhNREEwT0RJd05DSXNJbDlwWkNaNkluWXhYM1Z6WlhKekx6RXdNRFE0TWpBMElpd2libUZ0WlNJNklrRm5kVzVuSUZOMWNubGhJRUpoYm1kellTSXNJbVZ0WVdsc0lqb2ljR0ZwYm1GdVpHVnpkR2x1WldSQWVXRm9iMjh1WTI5ddlpd2liR1YyWld3aU9qQXNJbWxoZENJNk1UUTNOek0zTVRnMk55d2laWGh3SWpveE5EYzNOVFEwTmpZc2ZRLmtUN0IzNW9YYjQ2RmU3WWFLYkd4MXhoYkdGUWJ1TFg1U053N3FWSjNfa2siffQ==; expires=Thu, 27 Oct 2016 05:04:27 GMT; path=/; HttpOnly

但是当我查看devtools时,cookie未设置。甚至在我刷新几次之后。

我在这里想念什么?我是否需要创建代理来处理此问题? *我曾经使用代理,它运作良好

3 个答案:

答案 0 :(得分:2)

我终于通过与后端工程师协调解决了这个问题:

  1. 从Access-Control-Allow-Origin中删除通配符,并使用特定的域来源。如果没有,
  2. 设置Access-Control-Allow-Credentials: true
  3. 在请求中,我将withCredentials设置为true

    注意:如果您将withCredentials设置为true,则还必须将Access-Control-Allow-Credentials设置为true。另外,如果您仍然在Access-Control-Allow-Origin使用通配符,那么这项工作将无法使用。

    Further reading about "Request With Credentials"

答案 1 :(得分:0)

在我的情况下,我使用的是相同的域(无芯)。

我发现:除非您设置凭据初始化选项,否则获取不会发送cookie:

fetch(url, {
    method: 'POST',
    credentials: 'same-origin',
    headers: {...},
    ...
  });

答案 2 :(得分:0)

目前,我做了这样的事情。

Mapper_1  
Mapper_2  
NullpointerExcpetion  

//API REST ROUTE
app.get('/login', function(req, res){ 
    console.log('login route', process.env.NODE_ENV);
    const token = '*/*--=3432432$%^%$'
    
    res.set('Access-Control-Allow-Origin', req.headers.origin); //req.headers.origin
    res.set('Access-Control-Allow-Credentials', 'true');
    // access-control-expose-headers allows JS in the browser to see headers other than the default 7
    res.set(
        'Access-Control-Expose-Headers',
        'date, etag, access-control-allow-origin, access-control-allow-credentials'
    );
    
    res
        .cookie('rest-auth-cookie', token, {
            httpOnly: true,
            // secure: process.env.NODE_ENV !== 'development',
            sameSite: 'strict',
            // maxAge: 100,
            path: '/'
          })
        .status(200)
        .json({message: 'success'})
});