返回顶部
首页 > 资讯 > 精选 >前端node Session和JWT鉴权登录怎么实现
  • 314
分享到

前端node Session和JWT鉴权登录怎么实现

2023-07-02 15:07:15 314人浏览 安东尼
摘要

本篇内容介绍了“前端node Session和Jwt鉴权登录怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!服务端渲染及se

本篇内容介绍了“前端node Session和Jwt鉴权登录怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

    服务端渲染及session鉴权

    服务端渲染

    服务端渲染简单来说就是前端页面是由服务器通过字符串拼接动态生成的,客户端不需要额外通过ajax请求参数,只需要做好渲染工作即可。

    优点

    • 前端耗时少,前端只需要请求一次接口就能将数据渲染出来,首屏加载速度变快。

    • 利于SEO,因为服务器端相应的是完整的html页面内容,利于爬虫获取信息。

    缺点

    • 占用服务器资源,请求过多会造成访问压力。

    • 不利于前后端分类,并且前端复杂度高时不利于开发

    服务端身份验证Session原理

    对于服务端渲染,推荐使用Session认证机制,再次之前,先说明一下cookie

    前端node Session和JWT鉴权登录怎么实现

    比如你可以在baidu.com看到以下cookie:

    前端node Session和JWT鉴权登录怎么实现

    session的鉴权就是利用了cookie,用户调用登录接口,完成账号密码的校验之后,将用户信息或者其他校验信息生成为cookie字符串,返回给用户,同时将cookie存储在服务器内存,用户请求其他接口时,会在请求头自动将cookie发送给服务器,服务器会通过与服务器内存中的用户信息匹配,如果匹配成功,则返回客户端想要的内容,否则抛出错误提示客户端需要重新登录。大致流程图如下:

    前端node Session和JWT鉴权登录怎么实现

    实践操作

    接下来我们来进行实践操作,在此之前请预先执行 npm i express express-session,安装所需要的模块。

    index.js文件的代码如下:

    // 导入 express 模块const express = require('express')// 创建 express 的服务器实例const app = express()// 01:配置 Session 中间件const session = require('express-session')app.use(  session({    secret: 'heyyyyfx',//此处的secret密钥可以是任意字符串,是你自己制定的专属加密方案,此处笔者将以自己的名字为例    resave: false,//无需在意,但是要写上    saveUninitialized: true,//无需在意,但是要写上  }))// 托管静态页面,此处笔者代理了一个静态文件,文件内容下文可见。app.use(express.static('./pages'))// 解析 POST 提交过来的表单数据app.use(express.urlencoded({ extended: false }))// 登录的 api 接口app.post('/api/login', (req, res) => {  // 判断用户提交的登录信息是否正确,此处写死一个账号密码校验,在实际开发中肯定是需要数据库匹配。  if (req.body.username !== 'admin' || req.body.passWord !== '000000') {    return res.send({ status: 1, msg: '登录失败' })  }  // 02:请将登录成功后的用户信息,保存到 Session 中  // 注意:只有成功配置了 express-session 这个中间件之后,才能够通过 req 点出来 session 这个属性  req.session.user = req.body // 用户的信息,我们将用户的信息转换成cookie字符串返回给用户。  req.session.islogin = true // 用户的登录状态,也是我们鉴权的参考  res.send({ status: 0, msg: '登录成功' })})// 获取用户姓名的接口app.get('/api/username', (req, res) => {  // 03:请从 Session 中获取用户的名称,响应给客户端  if (!req.session.islogin) {//此处就进行了鉴权,看用户的cookie是否有我们之前发送给他的islogin字段。    return res.send({ status: 1, msg: 'fail' })  }  res.send({    status: 0,    msg: 'success',    username: req.session.user.username,  })})// 退出登录的接口app.post('/api/loGout', (req, res) => {  // 04:清空 Session 信息  req.session.destroy()  res.send({    status: 0,    msg: '退出登录成功',  })})// 调用 app.listen 方法,指定端口号并启动WEB服务器app.listen(80, function () {  console.log('Express server running at Http://127.0.0.1:80')})

    其他

    缺陷

    可以看到,Session机制需要cookie的配合才能实现,因此cookie的的缺点或特性也就会影响到Session鉴权,比如,cookie是默认不支持跨域的,当前端跨域请求后端接口时,需要做很多额外的配置,这也就是为什么Session推荐在服务端使用。

    关于跨域

    笔者在本文中说到的的跨域问题,指的是客户端和服务端二者的跨域,如果读者下载了源码,可以看到笔者是在app.js(index.js)中使用app.use(express.static('./pages'))进行了静态托管,以此来保证客户端和服务端都是locallhost:80,是同源的。感兴趣的读者可以尝试用live Sever来代理Index.html文件,看看效果如何,在此之前记得引入cors中间件支持跨域。

    想说的

    其实笔者在此只是简单讲解了Session鉴权的大致原理以及进行了简单的实现,在实际真实开发中,首先我们不建议将用户信息返回生成cookie字符串再返回给客户端,因为这是非常隐私的信息,其次要知道cookie是可以直接在客户端更改的,因此鉴权关键字段也是需要斟酌的,现实开发是非常严谨的,请读者在实际使用时秉承严谨的态度。

    JWT鉴权

    适用情况

    上文已经说到了,session会受到跨域的影响,因此在前后端分离开发以及存在跨域的情况下,我们推荐使用JWT鉴权。

    JWT鉴权原理

    JWT原理和Session大致相同,不同的点在于,JWT生成的Token字符串需要客户端手动存储在localStoragesessionStorage中。再次请求时,客户端需要将Token放在请求头的Authorization字段中。

    前端node Session和JWT鉴权登录怎么实现

    JWT

    jwt是JSON Web Token的缩写,它的结构分为三个部分:header.payload.signature,两两之间用【.】分隔。

    前端node Session和JWT鉴权登录怎么实现

    header

    header是一个JSON结构,主要包含token的类型(即JWT),签名的算法

    {    "alg":"HS256",    "typ":"JWT"}

    payload

    payload也是JSON结构,它是存放有效信息的地方,JWT官方提供了一些官方字段,你也可以定义自己的私有字段,其中官方字段如下:

    • iss:签发人

    • exp:token过期时间

    • sub:主题

    • aud:受众

    • nbf:生效时间

    • iat:签发时间

    • jti:编号

    但是注意,payload是默认不加密的,因此建议自己定义的私有字段不要放入用户私密信息。

    signature

    它是用户自己定义的字段,用户要设计一个独一无二且保证不会外泄的密钥,通过下方算法生成签名,用于未来的身份验证。

     HMacSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

    实践

    首先安装必要的npm包,执行以下指令:

    npm i body-parser cors express express-jwt jsonwebtoken,

    在index.js中写入以下内容:

    // 导入 express 模块const express = require('express')// 创建 express 的服务器实例const app = express()// 01:安装并导入 JWT 相关的两个包,分别是 jsonwebtoken 和 express-jwtconst jwt = require('jsonwebtoken')const expressJWT = require('express-jwt')// 允许跨域资源共享const cors = require('cors')app.use(cors())// 解析 post 表单数据的中间件const bodyParser = require('body-parser')app.use(bodyParser.urlencoded({ extended: false }))// 02:定义 secret 密钥,建议将密钥命名为 secreTKEyconst secretKey = 'heyyyyfx'// 04:注册将 JWT 字符串解析还原成 JSON 对象的中间件// 注意:只要配置成功了 express-jwt 这个中间件,就可以把解析出来的用户信息,挂载到 req.user 属性上// unless指定哪些接口不需要访问权限,即白名单。app.use(expressJWT({ secret: secretKey }).unless({ path: [/^\/api\//] }))// 登录接口app.post('/api/login', function (req, res) {  // 将 req.body 请求体中的数据,转存为 userinfo 常量  const userinfo = req.body  // 登录失败  if (userinfo.username !== 'admin' || userinfo.password !== '000000') {    return res.send({      status: 400,      message: '登录失败!',    })  }  // 登录成功  // 03:在登录成功之后,调用 jwt.sign() 方法生成 JWT 字符串。并通过 token 属性发送给客户端  // 参数1:用户的信息对象  // 参数2:加密的秘钥  // 参数3:配置对象,可以配置当前 token 的有效期,本处设置的是30S  // 记住:千万不要把密码加密到 token 字符中  const tokenStr = jwt.sign({ username: userinfo.username }, secretKey, { expiresIn: '30s' })  res.send({    status: 200,    message: '登录成功!',    token: tokenStr, // 要发送给客户端的 token 字符串  })})// 这是一个有权限的 API 接口app.get('/admin/getinfo', function (req, res) {  // 05:使用 req.user 获取用户信息,并使用 data 属性将用户信息发送给客户端  console.log(req.user)  res.send({    status: 200,    message: '获取用户信息成功!',    data: req.user, // 要发送给客户端的用户信息  })})// 06:使用全局错误处理中间件,捕获解析 JWT 失败后产生的错误app.use((err, req, res, next) => {  // 这次错误是由 token 解析失败导致的  if (err.name === 'UnauthorizedError') {    return res.send({      status: 401,      message: '无效的token',    })  }  res.send({    status: 500,    message: '未知的错误',  })})// 调用 app.listen 方法,指定端口号并启动web服务器app.listen(8888, function () {  console.log('Express server running at http://127.0.0.1:8888')})

    开启node服务后,用postman进行测试,调用登录接口后,拿到返回的Token:

    前端node Session和JWT鉴权登录怎么实现

    随后调用获取用户信息接口,注意,该接口是需要权限的,我们需要在请求头中加入Authorization字段,值为Token,同时有个注意事项,Token值前需要加入Bearer关键字,用空格分隔,这是必要的操作。

    前端node Session和JWT鉴权登录怎么实现

    如果你操作的过慢,就会看到如下报错,这是因为我们的有效期只有30s。

    前端node Session和JWT鉴权登录怎么实现

    不妨再调用一次登录接口,同时迅速用新的Token请求用户信息接口,结果如下,说明成功。

    前端node Session和JWT鉴权登录怎么实现

    想说的

    Token有效期问题

    在本文中,我们是自己为Token设置了30s的有效期,但如果你用心观察国内外的网站,貌似没有出现用着用着就突然返回到登录界面让你突然重新登陆的,难道是因为他们的有效期设置的特别长?

    其实在真实开发中,Token的有效期往往不会用这种方式设置,大多数有效期是动态的,打个比方,只有当你在当前页面半小时之内没有任何请求之后,才会让你的Token自动失效,这种是怎样实现的?其实有很多种实现方案,笔者在此只举一种例子,读者可以先了解一下redis数据库

    Redis数据库及动态Token解决方案

    redis的优点在此不做过多说明,感兴趣的可以自行查阅,redis数据库提供了一个叫expire的命令,命令用于设置 key 的过期时间,key 过期后将不再可用。单位以秒计。

    我们可以以此为基础,当用户请求登录接口时,我们将Token返回给用户,同时我们将这个Token作为Key存储到数据库,Value为这个用户的个人信息或其他内容,并为这个key设置一个定时删除命令,当用户在有效期时,数据库将用户请求接口时携带的Token进行查询,看是否存在这个Token的key,当可以被查询时,说明有效期还在(因为过了有效期这个Token就会被删除,表中就无法查询到这个Token),同时再次对这个Key执行定时删除任务,达到覆盖上一次删除定时任务,延长有效期的作用,只有当没有接口请求后,删除任务执行,Token才会失效,以此来实现动态Token的目的,至于覆盖定时删除任务这个操作,因为是每一个操作相关的接口都要进行,因此不妨将它封装成全局中间件,避免在每个接口中都写下重复代码。

    “前端node Session和JWT鉴权登录怎么实现”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

    --结束END--

    本文标题: 前端node Session和JWT鉴权登录怎么实现

    本文链接: https://lsjlt.com/news/342829.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • 前端node Session和JWT鉴权登录怎么实现
      本篇内容介绍了“前端node Session和JWT鉴权登录怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!服务端渲染及se...
      99+
      2023-07-02
    • 前端nodeSession和JWT鉴权登录示例详解
      目录服务端渲染及session鉴权服务端渲染优点缺点服务端身份验证Session原理实践操作其他缺陷关于跨域想说的JWT鉴权适用情况JWT鉴权原理JWTheaderpayloadsi...
      99+
      2024-04-02
    • 基于PHP怎么实现JWT登录鉴权
      本文小编为大家详细介绍“基于PHP怎么实现JWT登录鉴权”,内容详细,步骤清晰,细节处理妥当,希望这篇“基于PHP怎么实现JWT登录鉴权”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、什么是JWT1、简介JWT...
      99+
      2023-06-30
    • JWT是什么?Node中怎么实现JWT鉴权机制(浅析)
      【相关教程推荐:nodejs视频教程】一、为什么使用JWT一种技术的出现,就是弥补另一种技术的的缺陷。在JWT出现之前,Session 认证机制需要配合 Cookie 才能实现。由于 Cookie 默认不支持跨域访问,所以,当涉及到前端跨域...
      99+
      2022-11-22
      nodejs​ node
    • SpringBoot结合JWT实现用户登录、注册、鉴权
      目录一、用户注册与登录二、用户鉴权用户登录、注册及鉴权是我们基本所有系统必备的,也是很核心重要的一块,这一块的安全性等都比较重要,实现的方案其实也有几种,从以前的cookie+ses...
      99+
      2023-05-19
      SpringBoot JWT 登录 注册 鉴权
    • 基于PHP实现JWT登录鉴权的示例代码
      目录一、什么是JWT1、简介2、JWT的组成3、JWT验证流程和特点二、相关问题三、PHP实现1、引入依赖2、功能实现3、封装工具类如下一、什么是JWT 1、简介 JWT(JSON ...
      99+
      2024-04-02
    • Sa-Token实现分布式登录鉴权(Redis集成 前后端分离)
      文章目录 1. Sa-Token 介绍2. 登录认证2.1 登录与注销2.2 会话查询2.3 Token 查询 3. 权限认证3.1 获取当前账号权限码集合3.2 权限校验3.3 角色校...
      99+
      2023-09-02
      分布式 java 服务器
    • Node怎么运用Cookie和Session进行登录验证
      本篇内容主要讲解“Node怎么运用Cookie和Session进行登录验证”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Node怎么运用Cookie和Session进行登录验证”吧!1️⃣ 定义...
      99+
      2023-07-04
    • 使用Django怎么实现前后端登录
      这期内容当中小编将会给大家带来有关使用Django怎么实现前后端登录,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。前端登录1. login.vue<template>  &...
      99+
      2023-06-14
    • Node中怎么实现前后端交互
      Node中怎么实现前后端交互,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。index.html:<!doctype> <...
      99+
      2024-04-02
    • Spring Boot怎么集成JWT实现前后端认证
      本文小编为大家详细介绍“Spring Boot怎么集成JWT实现前后端认证”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring Boot怎么集成JWT实现前后端认证”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢...
      99+
      2023-06-30
    • node+vue前后端分离实现登录时使用图片验证码功能
      目录后端代码前端代码获取验证码方法登录验证方法记录一下前端使用验证码登录的过程后端用的是node.js,关键模块是svg-captcha前端使用的是vue2最后的登录界面如下: 后...
      99+
      2022-11-13
       vue图片验证码登录 node前后端分离验证码登录
    • 浅析node怎么实现单点登录系统
      一. 基础知识1.1 同源策略源 = 协议 + 域名 +端口以http://www.a.com为例:https://www.a.com ❌(协议不同)http://www.b.com ❌(域名不同)http://www.a.com:3000...
      99+
      2022-11-22
      nodejs node
    • .NET Core怎么实现Cookie和JWT混合认证、授权
      本篇内容介绍了“.NET Core怎么实现Cookie和JWT混合认证、授权”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言为防...
      99+
      2023-06-26
    • laravel怎么实现非法登录和权限控制功能
      本篇内容介绍了“laravel怎么实现非法登录和权限控制功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、首先我们打开artisan输入...
      99+
      2023-07-04
    • Java后端登录功能怎么实现
      本篇内容介绍了“Java后端登录功能怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一. 登录需求分析页面原型 登录页面展示:项目路径...
      99+
      2023-06-30
    • Node怎么实现前后端数据传输加密解密
      今天小编给大家分享一下Node怎么实现前后端数据传输加密解密的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一...
      99+
      2024-04-02
    • 浅析node是怎么实现github第三方登录的
      一、详细流程二、具体流程1.注册应用①登录github,Settings=>Developer settings=>OAuth Apps=>Register a new application ②填写应用信息③注册完成,得...
      99+
      2022-11-22
      nodejs​ node
    • 新版小程序怎么实现登录授权
      这篇文章主要介绍新版小程序怎么实现登录授权,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!小程序自上线以来,官方一直在调整API,因此也出现了一批被废弃的接口,作为程序员的我们,此时此...
      99+
      2024-04-02
    • 怎么实现小程序的登录与授权
      这篇文章主要介绍怎么实现小程序的登录与授权,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!登录:如果我们要实现小程序的登录,不妨尝试在开启小程序的时候完成登录。也就是说我们可以在app.js中的onlaunch方法中添...
      99+
      2023-06-06
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作