Node-express项目--个人简历:添加token认证

Posted 安之ccy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Node-express项目--个人简历:添加token认证相关的知识,希望对你有一定的参考价值。

关于token
用JWT实现token功能
验证token

关于token:

       用户登录之后,我们希望给登录后的操作增加一个身份认证,可以用token来实现。关于token的解释,可以看这篇文章。大概可以概括成:token是服务端生成、用于辅助识别客户端的“暗号”;免去每次客户请求,服务端都需要查询数据库重新验证用户名密码的步骤,只需对应的上此token即可,减轻服务端的压力

JWT

我们使用JWT来实现token功能,
JWT概念:
       关于JWT的解释,可以看这篇文章这篇文章,简单地说,JWT提供了过期时间的机制,并且支持多种加密算法,输出的token是个字符串,由头部、载荷与签名这三部分组成,中间以句点「.」分割

使用:
1.安装相关模块:npm install jsonwebtoken
2.在users.js中引入:const jwt = require('jsonwebtoken');
3.在login路由处添加上token的代码,登录成功时,可以返回一个token

// token规则rule(很重要的信息不要放在这里,如密码)
const rule = {id:user.id, name:user.name};

// token规则rule,密钥secret,过期时间expiresIn,回调函数
jwt.sign(rule, secret, {expiresIn:3600},(err,token)=>{
    if(err) throw err;
    res.json({ success:true, token:"Bearer "+ token });
})

在这里插入图片描述

4.postman测试:
在这里插入图片描述

验证token:

验证token我使用了passport模块和passport-jwt

passport.js是Nodejs中的一个做登录验证的中间件
passport-jwt是JSON Web Token进行身份验证的Passport策略

安装:npm install passport-jwt passport
使用:
1.在index.js中引入passport并初始化

const passport=require('passport');
app.use(passport.initialize());

2.将passport传入./config/passport.js文件,分离其定义与使用

require('./config/passport')(passport);

3.在config文件夹下新建文件passport.js,规定token的验证是基于id的,当有数据库中匹配的id时返回该用户,没有匹配的id时返回false

var JwtStrategy = require('passport-jwt').Strategy,
    ExtractJwt = require('passport-jwt').ExtractJwt;
var opts = {}
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();

const User = require("../module/User");
const secret = require("./key").secret;
opts.secretOrKey = secret;

module.exports = passport=>{
    passport.use(new JwtStrategy(opts, function(jwt_payload, done) {
        User.findById(jwt_payload.id)
        .then(user=>{
            if(user){
                return done(null, user);
            }
            return done(null,false);
        })
    }));
   
}

4.在users.js中引入passport,定义路由,当token正确时返回用户的id,name和email信息

const passport=require('passport');

//$route GET api/users/current
//@desc return current user
//@access private
router.get("/current",passport.authenticate("jwt",{session:false}),(req,res)=>{
    res.json({
        id:req.user.id,
        name:req.user.name,
        email:req.user.email
    })
})

5.在postman测试
将login后获得的token(注意过期时间)复制到当前请求current的Header下的Authorization字段中,然后发送请求,获得结果:
在这里插入图片描述

以上是关于Node-express项目--个人简历:添加token认证的主要内容,如果未能解决你的问题,请参考以下文章

Node-express项目--个人简历:搭建个人经历experience接口

Node-express项目--个人简历:register(注册)接口编写记录

Node-express项目--个人简历:login(登录)接口编写记录

Node-express项目--个人简历:多种方法获取用户数据接口编写

Node-express项目--个人简历:搭建当前用户的个人信息接口Profile

Node-express项目--个人简历:解决问题“experience字段没有手动输入却显示数据”