时间:2021-05-26
最近研究了下基于token的身份验证,并将这种机制整合在个人项目中。现在很多网站的认证方式都从传统的seesion+cookie转向token校验。对比传统的校验方式,token确实有更好的扩展性与安全性。
传统的session+cookie身份验证
由于HTTP是无状态的,它并不记录用户的身份。用户将账号与密码发送给服务器后,后台通过校验,但是并没有记录状态,于是下一次用户的请求仍然需要校验身份。为了解决这一问题,需要在服务端生成一条包含用户身份的记录,也就是session,再将这条记录发送给用户并存储在用户本地,即cookie。接下来用户的请求都会带上这条cookie,若客户端的cookie与服务端的session能对应上,则说明用户身份验证通过。
token身份校验
流程大致如下:
对比传统的校验方式,token校验有如下优势:
下面介绍一下利用node+jwt(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_delete=0', 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 = Tips[1006]; } }).catch(e => { ctx.body = Tips[1002]; });});用户通过校验将获取到的token存放在本地:
store.set('loginedtoken',token);//store为插件之后客户端请求需要验证身份的接口,都会将token放在请求头里传递给服务端:
service.interceptors.request.use(config => { let params = config.params || {}; let loginedtoken = store.get('loginedtoken'); let time = Date.now(); let {headers} = config; headers = {...headers,loginedtoken}; params = {...params,_:time}; config = {...config,params,headers}; return config;}, error => { Promise.reject(error);})服务端对所有需要登录的接口均拦截token并校验合法性。
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(); }});本示例使用的公钥与私钥可自己生成,操作如下:
点此查看node后台代码
点此查看前端代码
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
内容用脚手架快速搭建node项目用mysql连接池实现与数据库的交互用jsonwebtoken实现token身份验证综合案例:用简介登录页面实现上述内容1.快速
最近了解下基于Token的身份验证,跟大伙分享下。很多大型网站也都在用,比如Facebook,Twitter,Google+,Github等等,比起传统的身份验
在PHP运行环境中配置IIS7实现基本身份验证的方法,其实IIS7身份验证的方法有好几种,比如Windows身份验证、摘要式身份验证等,相对来说IIS7基本身份
在Asp.Net框架中提供了几种身份验证方式:Windows身份验证、Forms身份验证、passport身份验证(单点登录验证)。每种验证方式都有适合它的场景
在nancy中,身份验证分为basic,form,token,stateless几种,basic和form这里不说了,其中如果是使用cookie来保存身份的,需