怎么使用node实现基于token身份验证

这次给大家带来怎么使用node实现基于token身份验证,使用node实现基于token身份验证的注意事项有哪些,下面就是实战案例,一起来看一下。

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

传统的session+cookie身份验证

由于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 都会被拦截。

下面介绍一下利用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  {  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

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

Angular项目中使用scss步骤详解

怎样使用vue2.0+koa2+mongodb实现注册登陆

以上就是怎么使用node实现基于token身份验证的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2757131.html

(0)
上一篇 2025年3月8日 07:50:09
下一篇 2025年3月6日 08:43:45

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • vue数据传递–我有特殊的实现技巧

    这篇文章主要介绍了vue数据传递一些特殊梳理技巧,需要的朋友可以参考下 前言 最近碰到了比较多的关于vue的eventBus的问题,之前定技术选型的时候也被问到了,vuex和eventBus的使用范围。所以简单的写一下。同时有一种特殊的实现…

    编程技术 2025年3月8日
    200
  • 手写Node静态资源服务器的实现方法

    这篇文章主要介绍了手写node静态资源服务器的实现方法,现在分享给大家,也给大家做个参考。 想写静态资源服务器,首先我们需要知道如何创建一个http服务器,它的原理是什么 http服务器是继承自tcp服务器 http协议是应用层协议,是基于…

    2025年3月8日 编程技术
    200
  • 浅谈Node 调试工具入门教程

    这篇文章主要介绍了浅谈node 调试工具入门教程,现在分享给大家,也给大家做个参考。 JavaScript 程序越来越复杂,调试工具的重要性日益凸显。客户端脚本有浏览器,Node 脚本怎么调试呢? 2016年,Node 决定将 Chrome…

    2025年3月8日 编程技术
    200
  • vue使用vue-i18n实现国际化的实现代码

    本篇文章主要介绍了vue使用vue-i18n实现国际化的实现代码,现在分享给大家,也给大家做个参考。 需求 公司项目需要国际化,点击按钮切换中文/英文 1、安装 npm install vue-i18n –save 登录后复制 2、注入 …

    编程技术 2025年3月8日
    200
  • 如何使用Vue实现Observer

    这次给大家带来如何使用Vue实现Observer,使用Vue实现Observer的注意事项有哪些,下面就是实战案例,一起来看一下。 导语: 本文是对 Vue 官方文档深入响应式原理(https://cn.vuejs.org/v2/guide…

    2025年3月8日
    200
  • 怎样使用vue实现全选反选

    这次给大家带来怎样使用vue实现全选反选,使用vue实现全选反选的注意事项有哪些,下面就是实战案例,一起来看一下。 全选功能可以说是前端开发中非常常见的一个功能,以前的项目开发用jQuery开发比较多。最近在使用vue前端框架重构之前的项目…

    2025年3月8日
    200
  • 如何操作vue2实现购物车和地址选配

    这次给大家带来如何操作vue2实现购物车和地址选配,操作vue2实现购物车和地址选配的注意事项有哪些,下面就是实战案例,一起来看一下。 首先,vue基础js写法 new Vue({ el:”#app”, //模型 data:{ }, fil…

    编程技术 2025年3月8日
    200
  • vue-cli开发环境实现跨域请求的方法

    本篇文章主要介绍了vue-cli开发环境实现跨域请求的方法,现在分享给大家,也给大家做个参考。 前端开发时,请求后台接口经常需要跨域,vue-cli实现跨域请求只需要打开config/index.js,修改如下内容即可。 //例如要请求的接…

    编程技术 2025年3月8日
    200
  • 怎样使用vue实现下拉列表功能

    这次给大家带来怎样使用vue实现下拉列表功能,使用vue实现下拉列表功能的注意事项有哪些,下面就是实战案例,一起来看一下。 安装 cnpm install vue-droplist –save 登录后复制 组件中导入 import Dro…

    2025年3月8日
    200
  • 详解Vue基于 Nuxt.js 实现服务端渲染

    直接使用 vue 构建前端单页面应用,页面源码时只有简单的几行 html,这并不利于网站的 seo,这时候就需要服务端渲染,本篇文章主要介绍了详解vue基于 nuxt.js 实现服务端渲染(ssr),具有一定的参考价值,感兴趣的小伙伴们可以…

    2025年3月8日 编程技术
    200

发表回复

登录后才能评论