首页 >> 手游攻略

kxssw

大家好,感谢邀请,今天来为大家分享一下kxssw的问题,以及和Node.js 使用 express-jwt 解析 JWT的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!

Node.js上Token鉴权常用的是passport,它可以自定义校验策略,但如果你是用express框架,又只是解析JWT这种简单需求,可以尝试下express-jwt这个中间件。

关于JWT

JWT全称JSONWebToken,是代替传统session认证的解决方案。其原理是服务端生成一个包含用户唯一标识的JSON对象,颁发给客户端。客户端请求需要权限的接口时,只要把这个JSON再原样发回给服务端,服务器通过解析就可识别用户。

它通常是这个样子:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

这个JSON对象通过.分成三段,包含了请求头(加密算法)、负载信息(如userId、过期时间),还有通过服务端密钥生成的签名来保证不被篡改。

这种机制使服务端不再需要存储Token,因此是非常轻量的用户认证方案。并且对于微服务这种需要不同服务间共用Token的跨域认证,JWT是目前的首选。

关于express-jwt

express-jwt是Node.js的一个开源库,由ID认证服务提供商auth0开发,是专用于express框架下解析JWT的中间件。

它使用非常简单,而且会自动把JWT的payload部分赋值于req.user,方便逻辑部分调用。

开始使用安装

npminstallexpress-jwt加入中间件

constexpressJWT=require('express-jwt')nnapp.use(expressJWT({nsecret:'secret12345'//签名的密钥或PublicKeyn}).unless({npath:['/login','/signup']//指定路径不经过Token解析n}))n生成Token

生成Token的方式依然使用jsonwebtoken,比如将下列代码加入到登录接口的返回部分:

constjwt=require('jsonwebtoken')nnapp.post('/login',function(req,res){n//注意默认情况Token必须以Bearer+空格开头nconsttoken='Bearer'+jwt.sign(n{n_id:user._id,nadmin:user.role==='admin'n},n'secret12345',n{nexpiresIn:3600*24*3n}n)nres.json({nstatus:'ok',ndata:{token:token}n})n})n获取解析内容

当收到带Token的请求,如果解析成功,就可以在路由回调里通过req.user来访问:

app.get('/protected',function(req,res){nif(!req.user.admin)nreturnres.sendStatus(401)nres.sendStatus(200)n})n

req.user实际就是JWT的payload部分:

{n_id:'5dbbc7daaf7dfe003680ba39',nadmin:true,niat:1572587484,nexp:1573192284n}n解析失败

如果解析失败,会抛出UnauthorizedError,可以通过后置中间件来捕获:

app.use(function(err,req,res,next){nif(err.name==='UnauthorizedError'){nres.status(401).send('invalidtoken')n}n})n修改结果字段

默认解析结果会赋值在req.user,也可以通过requestProperty来修改:

app.use(jwt({nsecret:'secret12345',nrequestProperty:'auth'n}))n允许无Token请求

当接口允许不带Token和带Token两种状态的访问时(比如文章详情登录后判断点赞),可以通过credentialsRequired:false来对无Token请求不进行解析和抛出异常。

app.use(jwt({nsecret:'secret12345',ncredentialsRequired:falsen}))n自定义解析

通过getToken也可以自定义一些解析逻辑,比如使用其他Header字段,自定义抛出异常等:

app.use(jwt({nsecret:'secret12345',ncredentialsRequired:false,ngetToken:functionfromHeaderOrQuerystring(req){nif(req.headers.authorization&&req.headers.authorization.split('')[0]==='Bearer'){nreturnreq.headers.authorization.split('')[1]n}elseif(req.query&&req.query.token){nreturnreq.query.tokenn}nreturnnulln}n}))n吊销Token

在JWT机制中,由于Token通常不进行存储,如果想吊销某一条Token,一般都是通过被动的方式。

常用的方式是建立某个字段的黑名单(比如TokenId),对所有Token进行过滤,express-jwt专门提供了回调来处理这种情况:

constjwt=require('express-jwt')nconstblacklist=require('./blacklist')nnletisRevokedCallback=function(req,payload,done){nletissuer=payload.issnlettokenId=payload.jtinnblacklist.getRevokedToken(issuer,tokenId,function(err,token){nif(err){returndone(err)}nreturndone(null,!!token)//第二个参数为true则不通过n})n}nnapp.use(jwt({nsecret:'secret12345',nisRevoked:isRevokedCallbackn}))

更多用法可查看官方文档:https://github.com/auth0/express-jwt

关于kxssw到此分享完毕,希望能帮助到您。



本文由欣欣吧手游攻略栏目发布,感谢您对欣欣吧的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人站长或者朋友圈,但转载请说明文章出处“kxssw

标签:
kof小说
« 上一篇 2023-10-17