手机版

在Nodejs中使用JWT和会话

时间:2021-08-30 来源:互联网 编辑:宝哥软件园 浏览:

最近的项目需要在节点服务器上进行用户登录验证和权限拦截。专业名称是用户认证和授权。经过一定的数据收集,目前常用的有——JWT和Session两种。

使用JWT

JWT是JsonWebTokens的简写形式。我就不详细写了。我可以查一下资料。这里介绍了两个插件,express-jwt和JsonWebTokens,-

JsonWebTokens:用于生成token express-jwt:用于验证指定http请求的JsonWebTokens的有效性。如果有效,在req.user中设置jsonwebtoken的值,然后将其路由到对应的routerexpress-jwt,后者在内部引用jsonwebtoken并封装使用。使用JWT进行身份验证和授权的想法如下。

Jwt认证流程

它在服务器中的使用方式如下:

//安装NPM I jsonwebtoken-保存NPM I express-jwt-save//引入const jwt=require(' jsonwebtoken ');const expressJwt=require(' express-jwt ');//定义签名const secret=' salt//生成令牌const token=jwt . sign({ name : 123 },secret,{在: 60//秒到期时间内到期});//生成的令牌//eyjhbggcioijiuzi 1 nisinr 5 CCI 6 ikpxvcj 9 . eyjuyw1li joxmjmsimlhdci 6 mtq 5 mt q3ntqyncwizxhwijndkxndc1 ndg0f q . hync 4 qfayhzclmpalixfn 137d 41r 2cf k1xplflk 10 ju//使用中间件验证令牌app . Use(express jwt({ secret : secret })的有效性。除非({path: ['/login ','/getuser info ']//除这些地址外的所有URL都需要验证});//拦截器应用。使用(函数(err,req,RES,next){//当令牌验证失败时,如果(err。name==='未经授权的错误'){//这需要根据它自己的业务逻辑来处理(具体的err值见下文)res.status (401)。send(')} });//定义一个接口并将令牌返回给客户端app.get ('/getuserinfo ',函数(req,RES){ RES . JSON({ token : token })})。在客户端使用token的正确形式应该是将token放在授权的头中,对应的值应该以border开头,然后为空

authorization : bearer eyjhbggcioijiuzi 1 nisinr 5 CCI 6 ikpxvcj 9 . eyjuyw1li joiqmlutwfpbmcilcjkyxrhijipt 09 pt 09 psisimlhdci 6 mtuwmtgxnde4 cwizxwijoxn Taxod E0 MJQ 4FQ。gox GLC 6e 02w 5 VVQD Nawaorj 3MPO-4uyedngkr4bvte//可以写成axios中的const instance=Axios . create();const yourToken=' sfsgagfdgd//set request interceptor instance . interceptors . request . use(function(config){ config . headers . authorization=` carrier $ { your token } ` return config;})使用会话

传统认证和用户识别分别采用以下形式

服务器:创建一个会话对象来保存用户登录信息和状态,它有一个唯一的ID,并向客户端返回一个cookie。客户端:请求api时自动发送带有cookies的http头。这里,需要以使用cookies的方式引入两个插件:

Express-session:节点端的会话中间件,主要用于配置会话的属性,生成cookie-parser:节点端解析cookie对象的思路和JWT类似。这里的主要区别是,当客户端请求资源时,不需要手动在http请求的头部添加标识符,而是浏览器会自动添加cookies。具体用法如下

var express=require(' express ');var cookieParser=require(' cookie-parser ');var session=require(' express-session ');app . use(CookieParser(' session test '));App。使用(session({ secret : ' session test ',//与cookieParser resave: true一致,//(是否允许)当客户端并行发送多个请求时,其中一个请求会修改会话,并在另一个请求结束时保存。Rolling: true,//在每个响应中强制重置cookie的过期时间,并重新开始计时。saveUninitialized:true,//初始化会话时是否保存到存储。默认值为真,但是(后续版本)默认情况下可能会失败,因此最好手动添加它们。cookie : { maxage : 60 * 1000//到期时间(毫秒)});/* * *资源请求拦截器*如果登录状态过期或未登录,用户将自动抛出错误*/app.use (function (req,res,next){ let URL=req . originalur;req . session . touch();//刷新会话到期时间if (url!=='/login '!req . session . user){ RES . status(401)。发送(“登录状态已过期”);return } next();})比较

作为一个实用主义者,我尝试了两种方法,并结合在线博客,我总结了以下对比

JWT是无状态的、可扩展的、解耦的。使用JWT时不需要后端记录,每个令牌都是独立的。Session的诞生是为了解决http的无状态问题,即服务器存储每个用户对应的session对象,跨域、跨CORS的扩展性会比较繁琐。每次向后端发送请求时,您都需要检查JWT,只要经过验证,您就可以处理该请求。然而,cookies只能在单个域和子域中发挥作用。JWT一代消耗一定的内存,最小的比cookies还大。如果JWT包含许多声明,问题就更严重了,因为对服务器的每个请求都必须携带令牌。如果太大,请求会很慢。session优于JWT的地方在于,浏览器在请求时会自动带来带有cookie的http头,当用户继续使用时会不断刷新会话的到期时间,当浏览器关闭时会自动清除会话。相比之下,JWT本身不能随用户使用而更新或手动清除,只能自动过期。以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。

版权声明:在Nodejs中使用JWT和会话是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。