最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

node+token实现验证

来源:懂视网 责编:小采 时间:2020-11-27 19:51:10
文档

node+token实现验证

node+token实现验证:这次给大家带来node+token实现验证,node+token实现验证的注意事项有哪些,下面就是实战案例,一起来看一下。最近研究了下基于token的身份验证,并将这种机制整合在个人项目中。现在很多网站的认证方式都从传统的seesion+cookie转向token校验。对比
推荐度:
导读node+token实现验证:这次给大家带来node+token实现验证,node+token实现验证的注意事项有哪些,下面就是实战案例,一起来看一下。最近研究了下基于token的身份验证,并将这种机制整合在个人项目中。现在很多网站的认证方式都从传统的seesion+cookie转向token校验。对比

这次给大家带来node+token实现验证,node+token实现验证的注意事项有哪些,下面就是实战案例,一起来看一下。

最近研究了下基于token的身份验证,并将这种机制整合在个人项目中。现在很多网站的认证方式都从传统的seesion+cookie转向token校验。对比传统的校验方式,token确实有更好的扩展性与安全性。

传统的session+cookie身份验证

由于HTTP是无状态的,它并不记录用户的身份。用户将账号与密码发送给服务器后,后台通过校验,但是并没有记录状态,于是下一次用户的请求仍然需要校验身份。为了解决这一问题,需要在服务端生成一条包含用户身份的记录,也就是session,再将这条记录发送给用户并存储在用户本地,即cookie。接下来用户的请求都会带上这条cookie,若客户端的cookie与服务端的session能对应上,则说明用户身份验证通过。

token身份校验

流程大致如下:

  1. 第一次请求时,用户发送账号与密码

  2. 后台校验通过,则会生成一个有时效性的token,再将此token发送给用户

  3. 用户获得token后,将此token存储在本地,一般存储在localstorage或cookie

  4. 之后的每次请求都会将此token添加在请求头里,所有需要校验身份的接口都会被校验token,若token解析后的数据包含用户身份信息,则身份验证通过。

对比传统的校验方式,token校验有如下优势:

  1. 在基于token的认证,token通过请求头传输,而不是把认证信息存储在session或者cookie中。这意味着无状态。你可以从任意一种可以发送HTTP请求的终端向服务器发送请求。

  2. 可以避免CSRF攻击

  3. 当在应用中进行 session的读,写或者删除操作时,会有一个文件操作发生在操作系统的temp 文件夹下,至少在第一次时。假设有多台服务器并且 session 在第一台服务上创建。当你再次发送请求并且这个请求落在另一台服务器上,session 信息并不存在并且会获得一个“未认证”的响应。我知道,你可以通过一个粘性 session 解决这个问题。然而,在基于 token 的认证中,这个问题很自然就被解决了。没有粘性 session 的问题,因为在每个发送到服务器的请求中这个请求的 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();
 }
});

本示例使用的公钥与私钥可自己生成,操作如下:

  1. 打开命令行工具,输入openssl,打开openssl;

  2. 生成私钥:genrsa -out rsa_private_key.pem 2048

  3. 生成公钥: rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

点此查看node后台代码
点此查看前端代码

相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

推荐阅读:

code spliting优化Vue打包步骤详解

Vue2路由导航与axios拦截器封装

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文档

node+token实现验证

node+token实现验证:这次给大家带来node+token实现验证,node+token实现验证的注意事项有哪些,下面就是实战案例,一起来看一下。最近研究了下基于token的身份验证,并将这种机制整合在个人项目中。现在很多网站的认证方式都从传统的seesion+cookie转向token校验。对比
推荐度:
标签: 验证 实现 token
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top