我有一个用户身份验证系统,该系统会在身份验证成功后生成访问令牌。我需要将此令牌作为标头参数传递给其他页面,以允许使用该页面。
module.exports.authenticate=function(req,res){
var email=req.body.email;
var password=req.body.password;
connection.query('SELECT * FROM org WHERE email = ?',[email], function (error, results, fields) {
if (error) {
res.json({
status:false,
message:'query error'
})
}else{
if(results.length >0){
if(bcrypt.compareSync(password, results[0].password)){
var access_token = jwt.sign({ id: email }, 'secretpassword123', {expiresIn: 3600});
var decoded = jwt.decode(access_token, 'secretpassword123');
var expires_in = decoded.exp-decoded.iat;
var token_type = "org";
console.log(decoded);
req.headers.access_token = access_token;
res.cookie('access-token', access_token, { expires: new Date(Date.now() + 3600)})
res.status(200).send({ auth: true, access_token: access_token, expires_in, token_type});
}
else{
res.json({
status:false,
message:"Email or password does not match"
});
}
}
else{
connection.query('SELECT * FROM client WHERE email = ?',[email], function (error, results, fields) {
if (error) {
res.json({
status:false,
message:'query error'
})
}else{
if(results.length >0){
if(bcrypt.compareSync(password, results[0].password)){
var access_token = jwt.sign({ id: email }, 'secretpassword123', {expiresIn: 3600});
var decoded = jwt.decode(access_token, 'secretpassword123');
var expires_in = decoded.exp-decoded.iat;
var token_type = "client";
//res.status(200).send({ auth: true, access_token: access_token, expires_in, token_type});
connection.query('UPDATE client SET fingerprint = ?', access_token, function(error, results, fields){
if(error){
console.log(error);
}
else{
console.log(results);
}
})
return res.redirect('/dashboard.html');
}
else{
res.json({
status:false,
message:"Email and password does not match"
});
}
}
else{
res.json({
status:false,
message:"Email does not exist"
});
}
}
});
}
}
});}
我想将access-token
传递给其他页面和控制器,作为一种授权方式。
例如,这是我的get-user控制器:
module.exports.getUser = function(req,res){
var email = req.body.email;
req.headers.access_token = authenticate.authenticate.access_token
connection.query('SELECT clientid, email, orgid, name, phone, type, role, fingerprint, verified FROM client WHERE email = ?', req.body.email, function(error,results, fields){
if(error){
console.log(error)
res.redirect('/dashboard.html');
}
else{
console.log(req.headers)
console.log(results)
//res.redirect('/dashboard.html');
res.status(200).send(results);
}
})
}
我应该如何处理?
我已经取得了here的进步:
我已将res.cookie
添加到身份验证模块,并且可以看到cookie存储在浏览器中。但是,当我尝试使用req.cookies
或req.signedCookies
在另一页中读取cookie时,它说未定义。
我最终使用localStorage来存储令牌。按照oAuth标准,这显然不安全,但是可以。如何使用Cookie来获得与本地存储相同的功能。我需要使用身份验证模块中生成的令牌来验证其他页面中的授权。
答案 0 :(得分:2)
通常使用Cookie来实现。设置cookie后,它将附加到浏览器对服务器的每个请求中。例如。如果您使用的是express之类的框架,则可以执行类似的操作
res.cookie('access-token', access_token, { expires: new Date(Date.now() + 300000), httpOnly: true })
但是实际上,这只是将“ Set-Cookie” -HTTP-Header添加到您的响应中的一种便捷方法,这会导致浏览器创建cookie:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie
顺便说一句,出于安全原因,您可能应该设置'Secure'和'HttpOnly'标志,以确保cookie仅使用TLS(HTTPS)发送,而不能被JavaScript分别读取。 “ SameSite”指令还可用于防止CSRF攻击。