前端的JWT怎么进行用户认证?

实现用户认证和权限控制是Web应用开发中的重要部分,关系到用户的隐私和数据安全。在Go语言的后端开发中,一般会使用JSON Web Tokens(JWT)搭配存储中间件(如Redis)来处理用户认证和权限控制。JWT是一个开放标准 (RFC 7519),它定义了一种自包含的方式,用于在各方之间安全地传输信息作为一个 JSON 对象。这种信息可以被验证和信任,因为它是数字签名的。

在用户认证的背景下,当用户使用他们的凭证(比如,用户名和密码)首次登录时,服务器会创建一个JWT,并将其发送回用户。此后,用户每次发出请求都会携带这个JWT,服务器接收到请求后会验证JWT,如果验证通过,就认为这是一个有效的、已经登录的用户。这种方式很好地解决了无状态的HTTP协议如何持久化用户状态的问题。

JWT的主题部分通常会包括用户ID及其他一些元数据,例如角色信息、过期时间等,作为后续授权过程的依据。一般来说,每个JWT会在创建时指定一个过期时间,以减少因为令牌泄露后被滥用的风险。

用户认证

用户在登录时,后端需要验证用户的用户名和密码。如果验证通过,后端将会创建一个JWT,并将其发送给用户。JWT包含了用户的一些基本信息,例如用户ID等,并且通过密钥加密,确保数据不会被篡改。

import ("github.com/dgrijalva/jwt-go""time"
)// 创建JWT
func createToken(user User) (string, error) {token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{"id": user.ID,"expires":  time.Now().Add(time.Hour * time.Duration(1)).Unix(),})// Sign and get the complete encoded token as a string using the secrettokenString, err := token.SignedString([]byte("yourSecretKey"))return tokenString, err
}

权限控制

在用户完成登录后,每次发起的请求都必须包含JWT。服务器接收到请求后,将解码JWT,然后获取到用户的身份信息,此时我们可以针对不同的用户实施不同的权限控制。

// 验证JWT并检查用户权限
func authenticateMiddleware(endpoint func(http.ResponseWriter, *http.Request)) http.HandlerFunc {return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {tokenStr := r.Header.Get("Authorization")token, err := jwt.Parse(tokenStr, func(token *jwt.Token) (interface{}, error) {return []byte("yourSecretKey"), nil})if err != nil {http.Error(w, "Not authorized", 401)return}if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {userId := claims["id"].(string)// get user from db and check user's rolesuser := getUserFromDB(userId)if user.Role != "admin" {http.Error(w, "Not authorized", 401)return}} endpoint(w,r)})
}

这样,我们就可以在路由中使用此中间件函数来进行权限检查:

router.HandleFunc("/admin", authenticateMiddleware(adminHandler)).Methods("GET")

JWT安全性

在使用JWT(JSON Web Tokens)进行用户认证时,确保其安全性是非常重要的。以下是一些可以帮助提高JWT安全性的技巧和最佳实践:

  1. 使用安全的签名算法:JWT 支持多种签名算法,其中 HS256 是最常用的一种。然而,更安全的选择是使用 RS256,这是一种基于公钥/私钥的签名方式,只有持有私钥的服务器才能创建和签名 JWT,而公钥可以分发给任何需要验证 JWT 的人。
  2. 不在 JWT 中存储敏感数据:即使 JWT 是加密的,但任何人都可以解码并查看 JWT 的内容。因此,你应该避免在 JWT 中存储敏感信息,例如用户的密码或者其他私人信息。
  3. 设置短一些的过期时间:为 JWT 设置适当的过期时间可以降低其被盗用的风险。过期时间的设置应基于你的应用:如果你的应用安全性要求很高,那么你应该设置比较短的过期时间,例如 15 分钟;相反,如果不需要很高的安全性,那么你可以设置较长的过期时间。
  4. 使用 HTTPS:你应该始终通过 HTTPS 来传输 JWT,这样可以防止 JWT 在传输过程中被拦截。
  5. 使用“黑名单”:如果你的应用需要支持登出功能或者你希望能够主动废除 JWT,那么你可以维护一个 JWT 黑名单。每次接收到请求时,你都检查一下该 JWT 是否在黑名单中。一旦用户登出或者 JWT 被废除,就将其加入黑名单。

如果上面的内容对你有帮助,请点赞收藏哦,我会分享更多的知识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/593922.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软碟通UltraISO制作U盘安装Ubuntu

清华大学开源软件镜像站https://mirrors.tuna.tsinghua.edu.cn/ 从里面下载ubuntu-22.04-desktop-amd64.iso UltraISO是一款非常不错的U盘启动盘制作工具,一直被许多网友们所喜欢,使用简单、方便。 UltraISO官方下载地址:https://cn.ultrais…

魔改版小市值策略

策略思路 最近几年,小市值策略一直都收益不错(当然,不包含17年和18年)。小市值因子对收益的影响是很大的。特别是行情不好的时候,大家都忙着炒作热点,那么这时候符合题材的小市值更加符合炒作标准了。 为…

安装tensorrt环境在linux上

在linux上输入命令 bash cat /etc/os-release 命令查看系统版本 nvidia-smi命令后有内容弹出而没有报错,表明系统中安装了NVIDIA显卡驱动,并且该命令成功地显示了有关NVIDIA GPU的信息。 输入nvcc -V并且看到输出时,这表明您的系统中已经安装了NVIDIA的CUDA工具…

MySQL第三战:CRUD,函数1以及unionunion all

前言 在当今的数字化时代,数据库已经成为信息管理的重要工具。其中,MySQL作为一种流行的关系型数据库管理系统,已经广泛应用于各种业务场景。在本文中,我们将深入探讨MySQL中的核心概念,包括创建(Create&a…

[每周一更]-(第51期):Go的调度器GMP

参考文献 https://learnku.com/articles/41728http://go.cyub.vip/gmp/gmp-model.html#g-m-phttps://blog.csdn.net/ByteDanceTech/article/details/129292683https://www.ququ123.top/2022/04/golang_gmp_principle/ 什么是GMP? GMP模型是Go语言并发模型的核心概念&#x…

ASP.NET Core基础之图片文件(一)-WebApi访问静态图片

阅读本文你的收获: 学会在WebApi项目中访问静态图片了解静态文件中间件UseStaticFiles的用法 系统中免不了要去处理图片文件,比如上传商品的图片、显示商品的图片,访问系统中的图片等等,根据微软官网描述: 静态文件&a…

自动化测试框架 —— pytest框架入门到入职篇

01、pytest框架介绍 pytest 是 python 的第三方单元测试框架,比自带 unittest 更简洁和高效,支持非常丰富的插件,同时兼容 unittest 框架。这就使得我们在 unittest 框架迁移到 pytest 框架的时候不需要重写代码。 pytest框架优点 1、简单…

Ubuntu Server 22.04 连接Wifi并配置静态IP

Ubuntu Server 22.04 连接Wifi并配置静态IP 前言:我家最近好几台电脑,我都想跑着Ubuntu Server做服务器,但是近几年的超级本已经不自带网口了,所以我就考虑用Wifi来联网,速度也还可以,但是既然是跑服务&…

Nginx 中的日志

目录 1.定制访问日志记录格式 1.1 全部日志记录 1.2 每个网站独属一份日志 2.日志路径 3.错误日志 1.定制访问日志记录格式 1.1 全部日志记录 该配置处于nginx.conf 文件中 log_format compression $remote_addr - $remote_user [$time_local] "$request" $sta…

Word与Excel对应的Python 函数库

本文主要讲Word与Excel格式的文件 Word 格式与 Python 函数库 Python 操作 Word 格式的库是 python-docx 库 安装与导入方法 pip install python-docx ... import docx Excel 格式与 Python 函数库 xlsx 格式⼀般采⽤ openpyxl 进⾏读写如果是 xls 格式,对 Wor…

技术扫盲:如何优雅的使用 java -jar

java -jar xxx.jar java -jar 是一个用于在命令行界面中执行 Java 可执行 JAR 文件的命令。它的语法如下&#xff1a; java -jar <JAR 文件路径> [参数]其中&#xff1a; java 是 Java 运行时环境的可执行文件。-jar 是一个选项&#xff0c;表示要执行的文件是一个 JA…

Postman版IDEA插件!免费!

Postman是大家最常用的API调试工具&#xff0c;那么有没有一种方法可以不用手动写入接口到Postman&#xff0c;即可进行接口调试操作&#xff1f;今天给大家推荐一款IDEA插件&#xff1a;Apipost Helper&#xff0c;写完代码就可以调试接口并一键生成接口文档&#xff01;而且还…

面试多线程八股文五问五答第四期

面试多线程八股文五问五答第四期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;Java 如何实现多线程之间的通讯和协作&#xff1f; 使用共享变量&a…

一文读懂Solana 上最正统的铭文通证$mash

早在 2023 年的 11 月&#xff0c;包括 Solana、Avalanche、Polygon、Arbitrum、zkSync 等生态正在承接比特币铭文生态外溢的价值。当然&#xff0c;因铭文赛道过于火爆&#xff0c;当 Avalanche、BNB Chain 以及 Polygon 等链上 Gas 飙升至极值&#xff0c;Arbitrum、zkSync 等…

C++学习(二)

我们是在学习过了C语言&#xff0c;基础上来看这篇文章的&#xff0c;如果你是直接学C&#xff0c;这篇文章不太适合你的&#xff0c;因为这里只讲C基础中与C语言不同之处。 一.main函数区别 在C语言中&#xff0c;我们写main函数是不是可以省略前面的int,但是在C中&#xff…

深度学习|5.2 偏差和方差

偏差和方差 Bias&#xff08;偏差&#xff09;&#xff1a;偏差是指对样本点的估计值和实际值的偏离程度。偏差越大&#xff0c;样本点越不符合实际值。偏差衡量单个数据点的偏离程度&#xff0c;如下图的第二行。 Variance&#xff08;方差&#xff09;&#xff1a;方差能代表…

希尔排序算法——交换法

希尔排序&#xff0c;又称缩小增量排序&#xff0c;是插入排序的改进版。它是因DL&#xff0e;Shell于1959年提出而得名。希尔排序的实质就是分组插入排序&#xff0c;该方法是非稳定的排序算法。 具体来说&#xff0c;希尔排序通过将待排序序列分成多个子序列&#xff0c;分别…

罗技k380连不上蓝牙?

我一直以为是键盘锁住了&#xff0c;或者我按一些键 什么的可以解决&#xff0c;但是都没用。 解决方案&#xff1a;由于我把键盘放在了金属表面 &#xff0c;导致蓝牙失灵。 在官网上找到的解决方案&#xff0c;连接放在这里&#xff0c;里面还提到了不能在一些特殊的地方操…

大数据Doris(四十九):Doris数据导出介绍

文章目录 Doris数据导出介绍 一、​​​​​​​使用示例

CMake入门教程【核心篇】引用子模块.cmake文件(include)

&#x1f608;「CSDN主页」&#xff1a;传送门 &#x1f608;「Bilibil首页」&#xff1a;传送门 &#x1f608;「本文的内容」&#xff1a;CMake入门教程 &#x1f608;「动动你的小手」&#xff1a;点赞&#x1f44d;收藏⭐️评论&#x1f4dd; 文章目录 include子模块举个例…