哪里有做网站的公司校园网站建设网
web/
2025/10/1 10:28:33/
文章来源:
哪里有做网站的公司,校园网站建设网,现在由哪些网站可以做外链,淘大象排名查询最近研究了下基于token的身份验证#xff0c;并将这种机制整合在个人项目中。现在很多网站的认证方式都从传统的seesioncookie转向token校验。对比传统的校验方式#xff0c;token确实有更好的扩展性与安全性。 传统的sessioncookie身份验证 由于HTTP是无状态的… 最近研究了下基于token的身份验证并将这种机制整合在个人项目中。现在很多网站的认证方式都从传统的seesioncookie转向token校验。对比传统的校验方式token确实有更好的扩展性与安全性。 传统的sessioncookie身份验证 由于HTTP是无状态的它并不记录用户的身份。用户将账号与密码发送给服务器后后台通过校验但是并没有记录状态于是下一次用户的请求仍然需要校验身份。为了解决这一问题需要在服务端生成一条包含用户身份的记录也就是session再将这条记录发送给用户并存储在用户本地即cookie。接下来用户的请求都会带上这条cookie若客户端的cookie与服务端的session能对应上则说明用户身份验证通过。 token身份校验 流程大致如下 第一次请求时用户发送账号与密码 后台校验通过则会生成一个有时效性的token,再将此token发送给用户 用户获得token后将此token存储在本地一般存储在localstorage或cookie 之后的每次请求都会将此token添加在请求头里所有需要校验身份的接口都会被校验token若token解析后的数据包含用户身份信息则身份验证通过。 对比传统的校验方式token校验有如下优势 在基于token的认证token通过请求头传输而不是把认证信息存储在session或者cookie中。这意味着无状态。你可以从任意一种可以发送HTTP请求的终端向服务器发送请求。 可以避免CSRF攻击 当在应用中进行 session的读写或者删除操作时会有一个文件操作发生在操作系统的temp 文件夹下至少在第一次时。假设有多台服务器并且 session 在第一台服务上创建。当你再次发送请求并且这个请求落在另一台服务器上session 信息并不存在并且会获得一个“未认证”的响应。我知道你可以通过一个粘性 session 解决这个问题。然而在基于 token 的认证中这个问题很自然就被解决了。没有粘性 session 的问题因为在每个发送到服务器的请求中这个请求的 token 都会被拦截。 下面介绍一下利用nodejwt(jwt教程)搭建简易的token身份校验 示例 当用户第一次登录时提交账号与密码至服务器服务器校验通过则生成对应的token代码如下 const fs require(fs); const path require(path); const jwt require(jsonwebtoken); //生成token的方法 function generateToken(data){ let created Math.floor(Date.now() / 1000); let cert fs.readFileSync(path.join(__dirname, ../config/pri.pem));//私钥 let token jwt.sign({ data, exp: created 3600 * 24 }, cert, {algorithm: RS256}); return token; } //登录接口 router.post(/oa/login, async (ctx, next) { let data ctx.request.body let {name, password} data; let sql SELECT uid FROM t_user WHERE name? and password? and is_delete0, value [name, md5(password)]; await db.query(sql, value).then(res { if (res res.length 0) { let val res[0]; let uid val[uid]; let token generateToken({uid}); ctx.body { ...Tips[0], data: {token} } } else { ctx.body www.michenggw.com/ Tips[1006]; } }).catch(e www.yigouyule2.cn { ctx.body www.mhylpt.com/ Tips[1002]; }); }); 用户通过校验将获取到的token存放在本地 ? 1 store.set(loginedtoken,token);//store为插件 之后客户端请求需要验证身份的接口都会将token放在请求头里传递给服务端 service.interceptors.request.use(config { let params config.params |www.gcyl158.com| {}; let loginedtoken store.get(loginedtoken); let time Date.now(www.gcyL157.com); let {headers} config; headers {.www.feifanyule.cn/..headers,loginedtoken}; params {...params,_:time}; config {...config,params,headers}; return config; }, error { Promise.reject(error); }) 服务端对所有需要登录的接口均拦截token并校验合法性。 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 function verifyToken(token){ let cert fs.readFileSync(path.join(__dirname, ../config/pub.pem));//公钥 try{ let result jwt.verify(token, cert, {algorithms: [RS256]}) || {}; let {exp 0} result,current Math.floor(Date.now()/1000); if(current exp){ res result.data || {}; } }catch(e){ } return res; } app.use(async(ctx, next) { let {url } ctx; if(url.indexOf(/user/) -1){//需要校验登录态 let header ctx.request.header; let {loginedtoken} header; if (loginedtoken) { let result verifyToken(loginedtoken); let {uid} result; if(uid){ ctx.state {uid}; await next(); }else{ return ctx.body Tips[1005]; } } else { return ctx.body Tips[1005]; } }else{ await next(); } }); 本示例使用的公钥与私钥可自己生成操作如下 打开命令行工具输入openssl打开openssl; 生成私钥genrsa -out rsa_private_key.pem 2048 生成公钥 rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem 转载于:https://www.cnblogs.com/qwangxiao/p/10057156.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/85002.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!