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

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

相关推荐:

Node.js模块系统

node解释执行js的过程分析

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

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

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

(0)
上一篇 2025年3月8日 14:00:33
下一篇 2025年3月7日 01:59:05

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

相关推荐

  • node结合swig渲染摸板

    本篇文章给大家分享的内容是关于node结合swig渲染摸板 ,有着一定的参考价值,有需要的朋友可以参考一下 在这里就nodejs如何应用swig摸板,总结一下一些基本的用法。首先当然是利用express框架在node后台上面搭建服务 var…

    2025年3月8日
    200
  • node的process与child_process模块的使用详解

    这次给大家带来node的process与child_process模块的使用详解,使用node的process与child_process模块的注意事项有哪些,下面就是实战案例,一起来看一下。 进程的概念 在Node.js中每个应用程序都是…

    编程技术 2025年3月8日
    200
  • express+multer实现node图片上传的具体步奏

    这次给大家带来express+multer实现node图片上传的具体步奏,express+multer实现node图片上传的注意事项有哪些,下面就是实战案例,一起来看一下。 下文给大家介绍使用express+multer实现node中的图片…

    编程技术 2025年3月8日
    200
  • node Async的异步处理使用详解

    这次给大家带来node Async的异步处理使用详解,node Async异步处理使用详解的注意事项有哪些,下面就是实战案例,一起来看一下。 最近在研究nodejs,令我感受比较深的是……熟悉js代码的地球人都知道,js的加载顺序很重要!很…

    编程技术 2025年3月8日
    200
  • Node的模块系统使用详解

    这次给大家带来Node的模块系统使用详解,Node模块系统使用的注意事项有哪些,下面就是实战案例,一起来看一下。 模块是构建应用程序的基础,也使得函数和变量私有化,不直接对外暴露出来,接下来我们就要介绍Node的模块化系统和它最常用的模式 …

    编程技术 2025年3月8日
    200
  • 拦截器判断token失效跳转后的操作

    这次给大家带来拦截器判断token失效跳转后的操作,拦截器判断token失效跳转后的注意事项有哪些,下面就是实战案例,一起来看一下。 在拦截器中设置全局的token判断,意味着每次http请求都会校验token,与后台约定好的token过期…

    编程技术 2025年3月8日
    200
  • node操作文字生成图片

    这次给大家带来node操作文字生成图片,node操作文字生成图片的注意事项有哪些,下面就是实战案例,一起来看一下。 解决思路 文字转svg -> svg转png -> 合并图片 相关轮子 images Node.js 轻量级跨平…

    编程技术 2025年3月8日
    200
  • token怎么储存在客户端localStorage内

    这次给大家带来token怎么储存在客户端localStorage内,token储存在客户端localStorage内的注意事项有哪些,下面就是实战案例,一起来看一下。 我们后端有这样一个接口: http://localhost/yiiser…

    编程技术 2025年3月8日
    200
  • node服务器跨域步奏详解

    这次给大家带来node服务器跨域步奏详解,node服务器跨域的注意事项有哪些,下面就是实战案例,一起来看一下。 背景 我们都知道浏览器有一个既核心也最基本的安全功能,即同源策略。同源分别是:协议,域名,端口。如果浏览器访问服务器不同源的话,…

    2025年3月8日
    200
  • Postman发送token请求

    这次给大家带来Postman发送token请求,Postman发送token请求的注意事项有哪些,下面就是实战案例,一起来看一下。 Postman模拟发送带token的请求方法 1)google浏览器中安装扩展程序Interceptor 2…

    2025年3月8日
    200

发表回复

登录后才能评论