上一篇实现的登录接口如果正确返回的是一个res.json({msg:"success"},但是实际上应用中返回的都是token。
token在计算机身份认证中是令牌(临时)的意思,代表执行某些操作的权利的对象。包括:
访问令牌(Access token)表示访问控制操作主体的系统对象;
密保令牌(Security token),或者硬件令牌,例如U盾,或者叫做认证令牌或者加密令牌,一种计算机身份校验的物理设备;
会话令牌(Session token),交互会话中唯一身份标识符;
令牌化技术 (Tokenization), 取代敏感信息条目的处理过程。
此次我们使用jsonwebtoken来实现token。首先我们来安装jsonwebtoken
npm install jsonwebtoken
接下来在api中users.js里面引入jsonwebtoken
const jwt = require('jsonwebtoken');
jwt有一个sign()方法,类似一个签名
jwt.sign("规则", "加密名字", "过期时间", "箭头函数");
//箭头函数中可以对应的返回一个json
secretOrPublicKey(加密名字)
is a string or buffer containing either the secret for HMAC algorithms, or the PEM encoded public key for RSA and ECDSA. If jwt.verify
is called asynchronous, secretOrPublicKey
can be a function that should fetch the secret or public key.
为了使用jwt.sign()方法,在config中的keys.js里面添加secretOrPublicKey。
module.exports = {
mongoURI:"mongodb://127.0.0.1:27017/dbname",
secretOrKey:"secret"
}
然后在API中的user.js中引入
const User = require("../../models/Users");
接下来修改一个登陆接口,把isMatch正确返回值改为token
router.post("/login",(req,res)=>{
const email = req.body.email;
const password = req.body.password;
//查询数据库
User.findOne({email})
.then(user =>{
if(!user){
return res.json({email:"用户不存在"}); //return res.status(404).json({email:"用户不存在"});
}
//密码匹配 使用token
bcrypt.compare(password,user.password)
.then(isMatch=>{
if(isMatch){
const rule = {id:user.id,name:user.name};
//用id和name来做一个token
// jwt.sign("规则", "加密名字", "过期时间", "箭头函数");
jwt.sign(rule,keys.secretOrKey,{expiresIn:3600},(err,token)=> {
if(err) {throw err};
res.json({
success:true,
token:"dj" + token
//返回一个固定值+taken规则的的token
"success": true,
// "token": "djeyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjViN2Q5MDM0NjAwZGI5MGQ5MDhhN2U5YSIsIm
// 5hbWUiOiJkaiIsImlhdCI6MTUzNDk5NzkxNCwiZXhwIjoxNTM1MDAxNTE0fQ.bWB-tcnmZDP2G2aJZKNztr7KpD_iTtaZYf4OtAivoXI"
});
})
// res.json({msg:"success"});
}else{
return res.json({password:"密码错误!"});
//return res.status(400).json({password:"密码错误!"});
}
})
})
})