资讯专栏INFORMATION COLUMN

基于jsonwebtoken(JWT) 的web认证 (Node版实现)

baishancloud / 2505人阅读

摘要:什么是官方给出的定义是是一个开放标准,它定义了一种紧凑的独立的方式,用于安全地在当事人之间传递信息作为一个对象。结构由下面三个部分组成一个字符串通常由两个部分组成令牌的,即,以及正在使用的散列算法,如或。

什么是JSON Web Token ?

官方给出的定义是:
JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、独立的方式,用于安全地在当事人之间传递信息作为一个JSON对象。这些信息可以被验证和信任,因为它是数字签名的。JWTs可以使用一个secret (使用HMAC算法)或使用RSA的公钥/私钥对来签名。 文中我们使用公私钥的加密方式。

结构

由下面三个部分组成一个token字符串

Header

header通常由两个部分组成:令牌的type,即JWT,以及正在使用的散列算法,如HMAC SHA256或RSA。

Payload ,包含三个类型,自定义部分可以存储一些信息,如:用户信息、角色等;

Registered claims:已注册的,具体属性,点击传送

Public claims:自定义的,具体属性,点击传送

Private claims:这是在同意使用它们的各方之间共享信息的自定义声明,并且既没有注册也没有公开声明。

Signature

使用header、payload和secret生成一个签名

工作流程

这里直接使用官网的图

他的优点是什么?

使用json传输数据,因此在编码时,也会更小

更安全

无需在服务端保存相关信息,只需要验证token是否有效即可

代码实现
这里使用express来创建一个服务

创建一个入口文件,主要用于一些中间件的挂载

 //index.js
 const express = require("express")
const app  = express()
// 使用body-parser获取请求body
const bodyParser = require("body-parser");
const cookieParser = require("cookie-parser")


// 引入路由中间件
const routerAdmin = require("./app/router-admin")

app.use(bodyParser.json()); // for parsing application/json
app.use(bodyParser.urlencoded({ extended: true })); // for parsing application/x-www-form-urlencoded
app.use(cookieParser())

// 加载路由模块
app.use("/admin",routerAdmin);

app.listen(3000,function(){
    console.log("port 3000 start")
})

然后创建一个 app/router-admin.js 生成需要用到认证的路由中间件,这里我是在mongodb中取的用户信息,也可以自行模拟数据

//router-admin.js 

const express = require("express")
const router = express.Router()
var MongoClient = require("mongodb").MongoClient;

const jwt = require("jsonwebtoken")
const fs = require("fs")
// const secretStr = "sdfsjfklsjfiewjwoieow"

// 根据mongodb生成的_id查询数据
var ObjectId = require("mongodb").ObjectId
var url = "mongodb://localhost:27017/";

var payload = {
    user : "william",
    admin : true
}

router.post("/login",function(req,res){
    let name = req.body.name,
        pwd = req.body.pwd;
    var cert = fs.readFileSync("./private.key")
    MongoClient.connect(url, function(err, db) {
        if (err) throw err;
        var dbo = db.db("blog");
        var noSqlStr = {name:name,pwd:pwd}
        dbo.collection("userlist"). find(noSqlStr).toArray(function(err, result) { // 返回集合中所有数据
            if (err) throw err;
            // console.log(result);
            // 验证通过,服务端回传token
            if(!!result.length){
                var token = jwt.sign(payload, cert, { algorithm: "RS256" ,expiresIn:"30s"});
                res.send({
                    status : true,
                    msg : "",
                    token : token
                })
            }          
            db.close();
        });
    });
})

// 验证jsonwebtoken是否过期的中间件,在login接口后面执行,除了login接口的请求外,其他接口都需要验证token
router.use(function jwtVerify(req, res, next) {
    let token = req.get("token")
    console.log(token)
    var cert = fs.readFileSync("./public.key");  
    // 先解密
    jwt.verify(token, cert,function(err,decoded){
        if(err || !decoded) res.send({data:null,status:false,msg:err})
        
        if(decoded.user == payload.user){
            next();
        }
        
    });
});

router.get("/search",function(req,res){
    res.send({data:"查询成功",msg:"",status:true})
})


module.exports = router

因为这里使用的是公私钥的加密方式,需使用ssh-keygen生成公私钥

    私钥生成:ssh-keygen -t rsa -b 2048 -f private.key
    公钥生成:openssl rsa -in private.key -pubout -outform PEM -out public.key

完整项目地址 参考

https://jwt.io/introduction/

https://tools.ietf.org/html/r...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/95364.html

相关文章

  • 4.4 权限拦截控制AccessToken jwt-博客后端Api-NodeJs+Express+

    摘要:权限控制业务需求查看用户列表接口管理员才能使用更新用户信息接口当前对应用户才能调用这时候需要需要加入中间件来实现权限控制这时候咱们需要学习了解下课前学习了解入门教程基于的认证版实现本文中使用了插件现将服务逻辑代码附上服务配置设置创 权限控制 业务需求:查看用户列表接口(管理员才能使用)、更新用户信息接口(当前对应用户才能调用) 这时候需要需要加入中间件来实现权限控制: showImg(...

    CoXie 评论0 收藏0
  • Nginx实现JWT验证-基于OpenResty实现

    摘要:用于方便地搭建能够处理超高并发扩展性极高的动态应用服务和动态网关。 介绍 权限认证是接口开发中不可避免的问题,权限认证包括两个方面 接口需要知道调用的用户是谁 接口需要知道该用户是否有权限调用 第1个问题偏向于架构,第2个问题更偏向于业务,因此考虑在架构层解决第1个问题,以达到以下目的 所有请求被保护的接口保证是合法的(已经认证过的用户) 接口可以从请求头中获取当前用户信息 每个...

    xiangchaobin 评论0 收藏0
  • 一步一步搭建react应用-使用 jwt + redis 来做基于token用户身份认证

    摘要:一步一步构建一个应用开篇地址基于的认证流程客户端用户发登录请求服务端验证用户名密码验证成功服务端生成一个,响应给客户端客户端之后的每次请求中都带上这个服务端对需要认证的接口要验证,验证成功接收请求这里我们采用来生成,使用验证验证成功会把 [一步一步构建一个react应用-开篇](https://segmentfault.com/a/11... git地址 基于token的认证流程 客...

    Scholer 评论0 收藏0
  • 一步一步搭建react应用-使用 jwt + redis 来做基于token用户身份认证

    摘要:一步一步构建一个应用开篇地址基于的认证流程客户端用户发登录请求服务端验证用户名密码验证成功服务端生成一个,响应给客户端客户端之后的每次请求中都带上这个服务端对需要认证的接口要验证,验证成功接收请求这里我们采用来生成,使用验证验证成功会把 [一步一步构建一个react应用-开篇](https://segmentfault.com/a/11... git地址 基于token的认证流程 客...

    ivyzhang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<