2016-07-06 35 views
-1

我正在与一个单一的应用程序框架叫reactjs,我遇到的问题是设置httpOnly cookie,因为他们不能从客户端设置/读取我需要弄清楚如何使用快递。我想出了这是一个很好的/安全的方式来设置服务器端Cookie从客户端

一个想法是做一个POST请求像/cookie:data的路线,其中的数据是令牌的价值需要被存储在cookie中,因此:

app.post('/cookie:data', function(req, res) { 
    // Set cookie here 
    res.send(200) 
}) 

的问题,我很犹豫该令牌是否包含用于保护API的唯一用户标识符,并且我不确定我是否通过这种方式设置cookie来公开此信息。的

或者不使用:data将是有益弄清楚如何从POST请求获取数据(JSON对象)

编辑:我能想到的 一个问题是,任何人都可以发布到这条路线和设置不同的饼干?什么是保护它的方法?

编辑2: 这是快速设置我使用代理API调用(仅用于澄清评论相关)

app.use('/api', function (req, res) { 
    let url = config.API_HOST + req.url 
    req.pipe(request(url)).pipe(res) 
    }) 
+0

是不是更容易设置非httpOnly cookie?在安全性方面,我没有看到如何通过服务器端API设置任何cookie值更不安全。此外,无论如何,唯一的用户标识符将以任何方式暴露,因此使用HTTPS似乎是一项强制性要求。 – robertklep

+0

@robertklep这里的想法是找出一个可行的方法来设置httpOnly cookie,非httpOnly的不是我的选择,我怕因为他们的本性,能够通过js访问它们。 HTTPS也在保护Cookie的情况下。 – Ilja

+0

您想要在cookie中存储的数据来自哪里?我认为它不是来自你自己的服务器?如果您的FE正在调用第三方API,那么通过您自己的服务器代理对该API的请求是不是一个想法?对于一个严重的攻击者来说,如果他们无论如何都可以控制哪些cookies被设置(通过调用'/ cookie:data'),那么无法读取cookie内容可能不会成为障碍。 – robertklep

回答

1

说你要代理的所有请求开始/api到三阶除了/api/users,你想执行'手动',因为它会返回你需要的令牌:

app.post('/api/users', function(req, res) { 
    let url  = config.API_HOST + req.url; 
    let apiRequest = request.post(url, function(err, response, body) { 
    // Responses are just examples, you should tailor them to your situation 
    if (err) { 
     return res.sendStatus(500); 
    } else if (response.statusCode !== 200) { 
     return res.sendStatus(response.statusCode); 
    } else { 
     res.cookie('token', body).send('OK'); 
    } 
    }); 
    req.pipe(apiRequest); 
}) 

app.use('/api', function (req, res) { 
    let url = config.API_HOST + req.url 
    req.pipe(request(url)).pipe(res) 
}) 
+0

谢谢,这个工作。然而,不得不摆弄一下bodyParser。 – Ilja

+0

我发现的一个问题是,以这种方式使用它,我不再能够在客户端使用'.then'和'.catch'钩子,是否有办法保持这些功能(我假设发送状态为500)会意思是'.catch'被触发 – Ilja

+0

你使用哪个API客户端? – robertklep

相关问题