我正在实施JWT令牌以进行身份验证。
我没有使用像Angular或React这样的客户端站点框架。这只是EJS。
步骤1.我开发了一个API,在成功登录后返回令牌,如下图所示(我使用Postman测试API):
步骤2.然后我访问受限制的路由并使用令牌值传递Authorization标头,方法是在Postman中手动输入,它可以正常工作。
我的问题是在哪里以及如何从客户端上的步骤1保存返回的令牌,以便在步骤2的标题中发送它。
我是网络开发的新手,并且遵循教程,但是我发现的有关实现JWT令牌的所有教程都是针对Angular或React编写的,当涉及到客户端站点时。
非常感谢任何帮助。
谢谢!
答案 0 :(得分:2)
首先您必须使用JWT创建令牌:
const token=jwt.sign({
userId: user._id
},config.secret, {expiresIn: '24h'});
res.json({success:true,message:'Success', token:token, user: {username:user.username}});
您可以在前面然后将其保存到localStorage
中这将生成一个您可以在标题中实现的唯一键
在您的路线中之后,如果要检查标题中是否有JWT,请执行以下操作:
router.use((req,res,next)=>{
const token=req.headers['authorization'];
if(!token){
res.json({success:false, message:"No token provided"});
}
else{
jwt.verify(token, config.secret, (err,decoded)=>{
if(err){
res.json({success:false,message:"Token invalid: " + err});
}
else{
req.decoded=decoded;
next();
}
});
}
});
这是一个中间件,用于检查“授权”标题中是否有JWT密钥
请注意,在此之后的每条路线都将运行此中间件。
Here您将找到有关JSON Web令牌的所有详细信息
修改强>
以下是您如何处理AJAX请求:
$("submit").click(function(){
$.ajax({
url : 'api/login,',
type : 'POST',
data : {login: $('#login').val(),password:$('#password').val()}
dataType : 'JSON',
success : function(data, statut){
localStorage.setItem('token',data.token) // assuming you send a json token
},
error : function(resultat, statut, erreur){
// whatever code you want
},
complete : function(resultat, statut){
}
});
});
答案 1 :(得分:0)
有一个存储令牌的对象,如果你想在用户离开后保留令牌,这样只要令牌有效,他就会保持连接,你可以将它保存在localStorage中。
在客户端执行AJAX请求时,从localStorage的对象中检索令牌,并在Authorization标头中设置令牌。