node.js搭建接口(六):Node-使用jwt实现token

上一篇实现的登录接口如果正确返回的是一个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:"密码错误!"});
                    }
                })
            })
        })

 

你可能感兴趣的:(node.js)