微软公司做网站的软件怀化医保网站

news/2025/10/3 14:01:55/文章来源:
微软公司做网站的软件,怀化医保网站,软件开发一个月多少工资,php快速建网站文章目录 使用 JWT 进行身份校验jwt知识点补充认识JWTTOKEN是什么jwt的使用场景jwt的组成headerpayloadsignature 下载依赖包编写 jwt 工具包jwt中间件编写如何获取token 编写获取token的Apimodels逻辑编写路由逻辑编写修改路由逻辑 验证token将中间件接入Gin功能验证模块 续接… 文章目录 使用 JWT 进行身份校验jwt知识点补充认识JWTTOKEN是什么jwt的使用场景jwt的组成headerpayloadsignature 下载依赖包编写 jwt 工具包jwt中间件编写如何获取token 编写获取token的Apimodels逻辑编写路由逻辑编写修改路由逻辑 验证token将中间件接入Gin功能验证模块 续接上部分 使用 JWT 进行身份校验 在前面几节中我们已经基本的完成了 API’s 的编写但是还存在一些非常严重的问题例如我们现在的API是可以随意调用的这显然还不安全全在本文中我们通过 jwt-go GoDoc的方式来简单解决这个问题。 jwt知识点补充 jwt官网 认识JWT JSON Web TokenJWT是一个开放标准RFC 7519它定义了一种紧凑和自包含的方式用于在各方之间作为JSON对象安全地传输信息。 作为标准它没有提供技术实现但是大部分的语言平台都有按照它规定的内容提供了自己的技术实现所以实际在用的时候只要根据自己当前项目的技术平台到官网上选用合适的实现库即可。 TOKEN是什么 Token其实就是服务端生成的一串加密字符串、以作客户端进行请求的一个“令牌” jwt的使用场景 以下是JWT两种使用场景 授权这是使用 JWT 的最常见的使用场景。用户登录后每个后续请求都将包含 JWT允许用户访问使用该令牌允许的路由、服务和资源。单点登录是当今广泛使用 JWT 的一项功能因为它的开销很小并且能够跨不同域轻松使用。 信息交换JWT是在各方之间安全传输信息的比较便捷的方式。由于 JWT 可以签名例如使用公钥/私钥对因此可以确定发送者是否是在您的授权范围之内。并且由于签名是使用标头和有效负载计算的因此还可以验证内容是否未被篡改。 jwt的组成 这是一个JWT的token串 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c其实这一串是经过加密之后的密文字符串中间通过.来分割。每个.之前的字符串分别表示JWT的三个组成部分Header、Payload、Signature。 header Header的主要作用是用来标识,通常是两部分组成 typtype 的简写令牌类型也就是JWT。 algAlgorithm 的简写加密签名算法。一般使用HS256jwt官网提供了12种的加密算法 然后通过base64编码将明文编码,防止在传输过程中能直接一眼看出明文并符合多种传输协议 payload 也称为JWT claims payload用来承载要传递的数据它的json结构实际上是对JWT要传递的数据的一组声明这些声明被JWT标准称为claims它的一个“属性值对”其实就是一个claim每一个claim的都代表特定的含义和作用 claims有三类 保留claims主要包括iss发行者、exp过期时间、sub主题、aud用户等。 keyname说明iss发送者标识颁发 JWT 的发送主体sub主题标识 JWT 的主题aud接收者标识 JWT 所针对的接收者。每个在处理 JWT 的主体都必须使用受众声明中的值来标识自己。如果处理的主体在存在此声明时未将自己标识为声明中的值则必须拒绝 JWTexp到期时间标识不得接受 JWT 进行处理的过期时间。该值必须是日期类型而且是1970-01-01 000000Z 之后的日期秒。nbfjwt的开始处理的时间标识 JWT 开始接受处理的时间。该值必须是日期。iatjwt发出的时间标识 JWT 的发出的时间。该值必须是日期。jtijwt id令牌的区分大小写的唯一标识符即使在不同的颁发者之间也是如此。 保留claim为jwt标准中规定的claim验证方式已经定义好 公共claims定义新创的信息比如用户信息和其他重要信息。(使用较少)私有claims用于发布者和消费者都同意以私有的方式使用的信息。 明文实例 {sub: 12344321,name: Mars酱, // 私有claimsiat: 1516239022 }base64加密后 eyJzdWIiOiIxMjM0NDMyMSIsIm5hbWUiOiJNYXJz6YWxIiwiaWF0IjoxNTE2MjM5MDIyfQsignature Signature 部分是对Header和Payload两部分的签名作用是防止 JWT 被篡改。这个部分的生成规则主要是是公式伪代码是 Header中定义的签名算法alg(base64编码(header) . base64编码(payload),secret//在服务端加密使用的密钥 )JWT如果从字面上理解感觉是基于JSON格式用于网络传输的令牌。实际上JWT是一种紧凑的Claims声明格式常见的场景如HTTP授权请求头参数和URI查询参数。JWT会把Claims转换成JSON格式而这个JSON内容将会应用为JWS结构的有效载荷或者应用为JWE结构的加密处理后的原始字符串通过消息认证码Message Authentication Code或者简称MAC和/或者加密操作对Claims进行数字签名或者完整性保护。 下载依赖包 go get -u github.com/dgrijalva/jwt-go编写 jwt 工具包 我们需要编写一个jwt的工具包我们在pkg下的util目录新建jwt.go写入文件内容: package utilimport (timejwt github.com/dgrijalva/jwt-gogithub.com/kingsill/gin-example/pkg/setting )// 加载配置文件中设置的密钥 var jwtSecret []byte(setting.JwtSecret)// Claims 定义claims结构体 type Claims struct {Username string json:usernamePassword string json:passwordjwt.StandardClaims }func GenerateToken(username, password string) (string, error) {nowTime : time.Now()expireTime : nowTime.Add(3 * time.Hour)//创建 CustomClaims 结构体用来封装 jwt 信息claims : Claims{username,password,jwt.StandardClaims{ExpiresAt: expireTime.Unix(),Issuer: gin-blog,},}//创建 header和payload部分tokenClaims : jwt.NewWithClaims(jwt.SigningMethodHS256, claims)//得到完整的token字符串这里为加入签名signature部分token, err : tokenClaims.SignedString(jwtSecret)return token, err }func ParseToken(token string) (*Claims, error) {//解码过程tokenClaims, err : jwt.ParseWithClaims(token, Claims{}, func(token *jwt.Token) (interface{}, error) {return jwtSecret, nil})//验证是否时间过期if tokenClaims ! nil {if claims, ok : tokenClaims.Claims.(*Claims); ok tokenClaims.Valid {return claims, nil}}return nil, err } 在这个工具包我们涉及到: NewWithClaims(method SigningMethod, claims Claims)method对应着SigningMethodHMAC struct{}其包含SigningMethodHS256、SigningMethodHS384、SigningMethodHS512三种crypto.Hash方案func (t *Token) SignedString(key interface{}) 该方法内部生成签名字符串再用于获取完整、已签名的tokenfunc (p *Parser) ParseWithClaims 用于解析鉴权的声明方法内部主要是具体的解码和校验的过程最终返回*Tokenfunc (m MapClaims) Valid() 验证基于时间的声明exp, iat, nbf注意如果没有任何声明在令牌中仍然会被认为是有效的。并且对于时区偏差没有计算方法 jwt中间件编写 中间件相关知识 自定义中间件 有了jwt工具包接下来我们要编写要用于Gin的中间件我们在middleware下新建jwt目录新建jwt.go文件写入内容 package jwtimport (net/httptimegithub.com/gin-gonic/gingithub.com/kingsill/gin-example/pkg/egithub.com/kingsill/gin-example/pkg/util )// 自定义中间件 func JWT() gin.HandlerFunc {//返回.context函数return func(c *gin.Context) {var code intvar data interface{}//默认是正确状态code e.SUCCESS//参数查询url中token关键字token : c.Query(token)//如果为空则进行相关提示if token {code e.INVALID_PARAMS} else { //如果右token进行token的解析claims, err : util.ParseToken(token)if err ! nil { //如果解析出错相关提示code e.ERROR_AUTH_CHECK_TOKEN_FAIL} else if time.Now().Unix() claims.ExpiresAt { //如果解析出来token已过期则也有相关提示code e.ERROR_AUTH_CHECK_TOKEN_TIMEOUT}}//后续处理如果之前步骤有错误进行一下操作if code ! e.SUCCESS {c.JSON(http.StatusUnauthorized, gin.H{code: code,msg: e.GetMsg(code),data: data,})//放弃后续中间件的执行即如果有错后续中间件都不执行c.Abort()return}//如果没错放行 next前为请求中间件next后为相应中间件c.Next()} }如何获取token 编写获取token的Api 那么我们如何调用它呢我们还要获取Token呢 models逻辑编写 在models下新建auth.go文件写入内容 package models// jwt验证的 数据库相关操作// Auth 用户对应的struct模型 type Auth struct {ID int gorm:primary_key json:idUsername string json:usernamePassword string json:password }// CheckAuth 根据用户名和密码查询用户是否存在 func CheckAuth(username, password string) bool {var auth Authdb.Select(id).Where(Auth{Username: username, Password: password}).First(auth)if auth.ID 0 {return true}return false }} 路由逻辑编写 在routers下的api目录新建auth.go文件写入内容 package v1import (lognet/httpgithub.com/astaxie/beego/validationgithub.com/gin-gonic/gingithub.com/kingsill/gin-example/modelsgithub.com/kingsill/gin-example/pkg/egithub.com/kingsill/gin-example/pkg/util )// 定义我们验证用户所需的信息同时定义valid验证的预定信息即一定要有并且最大字符数为50 type auth struct {Username string valid:Required; MaxSize(50)Password string valid:Required; MaxSize(50) }func GetAuth(c *gin.Context) {//参数查询模式获取用户名和密码username : c.Query(username)password : c.Query(password)//通过设立结构体验证的valid验证即所需并且最大为50个字符valid : validation.Validation{}a : auth{Username: username, Password: password}ok, _ : valid.Valid(a)//建立存储信息的map key类型为stringval类型为任意值data : make(map[string]interface{})//设置默认code为参数错误code : e.INVALID_PARAMS//通过前序验证继续通过数据库进行验证if ok {//通过数据库进行验证isExist : models.CheckAuth(username, password)//如果通过数据库验证if isExist {//创建token令牌token, err : util.GenerateToken(username, password)if err ! nil { //如果生成令牌失败code e.ERROR_AUTH_TOKEN} else { //生成token成功进行存储data[token] tokencode e.SUCCESS}} else { //没通过数据库验证code e.ERROR_AUTH}} else { //没通过前序验证for _, err : range valid.Errors {log.Println(err.Key, err.Message)}}//json相应c.JSON(http.StatusOK, gin.H{code: code,msg: e.GetMsg(code),data: data,}) }修改路由逻辑 我们打开routers目录下的router.go文件修改文件内容新增获取 token 的方法 增添一句 r.GET(/auth, api.GetAuth)放在路由组之外 func InitRouter() *gin.Engine { r : gin.New()r.Use(gin.Logger())r.Use(gin.Recovery())gin.SetMode(setting.RunMode)r.GET(/auth, api.GetAuth)//------------------------apiv1 : r.Group(/api/v1) { ... }return r }验证token 获取token的 API 方法就到这里啦让我们来测试下是否可以正常使用吧 重启服务后用GET方式访问http://127.0.0.1:8000/auth?usernametestpasswordtest123456 查看返回值是否正确 {code: 200,data: {token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InRlc3QiLCJwYXNzd29yZCI6InRlc3QxMjM0NTYiLCJleHAiOjE3MDUzMzk2MzUsImlzcyI6Imdpbi1ibG9nIn0.4zblfic9MdOvrg4TF9Li8nfw3FSBq3rGgKqnJnDFXYY},msg: ok }我们有了token的 API也调用成功了 将中间件接入Gin 修改路由分组模块语句apiv1 : r.Group(/api/v1).Use(jwt.JWT())将jwt验证加入全局路由 ...apiv1 : r.Group(/api/v1) apiv1.Use(jwt.JWT()) { ... } ...当前目录结构 go-gin-example/ ├── conf │ └── app.ini ├── main.go ├── middleware │ └── jwt │ └── jwt.go ├── models │ ├── article.go │ ├── auth.go │ ├── models.go │ └── tag.go ├── pkg │ ├── e │ │ ├── code.go │ │ └── msg.go │ ├── setting │ │ └── setting.go │ └── util │ ├── jwt.go │ └── pagination.go ├── routers │ ├── api │ │ ├── auth.go │ │ └── v1 │ │ ├── article.go │ │ └── tag.go │ └── router.go ├── runtime到这里我们的JWT编写就完成啦 功能验证模块 我们来测试一下再次访问 http://127.0.0.1:8000/api/v1/articleshttp://127.0.0.1:8000/api/v1/articles?token23131 正确的反馈应该是 {code: 400,data: null,msg: 请求参数错误 }{code: 20001,data: null,msg: Token鉴权失败 } 我们需要访问http://127.0.0.1:8000/auth?usernametestpasswordtest123456 得到token 再用包含token的 URL 参数去访问我们的应用 API 这里的问题即为创建的token还需要自己复制粘贴不能自动取用等 访问http://127.0.0.1:8000/api/v1/articles?tokeneyJhbGci... 检查接口返回值 {code: 200,data: {lists: [],total: 0},msg: ok }验证正确文章列表取决于数据库内容

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

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

相关文章

[Node.js] chokidar 文件系统监听库

chokidar chokidar 是一个功能强大、跨平台、性能优秀的 文件系统监听库,适用于 Node.js 环境,底层使用原生 fs.watch 和 fs.watchFile,并在 macOS/Linux 上优先使用更高效的 fsevents(若可用)。 基本用法: impo…

常州培训做网站哪些软件可以做网页

文章目录 1.二分查找1.1题目1.2思路(核心:区间的定义)1.3左闭右闭1.4左闭右开1.5总结 2.移除元素2.1题目2.1思路2.2.1暴力解法2.2.2双指针法 23总结 3.有序数组的平方3.1题目3.2思路3.2.1暴力解法3.2.2双指针法 4.长度最小的子数组4.1题目4.2…

郑州app网站公司设计教程

Puppet 于本周发布了一份2024年的 DevOps 现状报告 The State of DevOps Report: The Evolution of Platform Engineering。该报告显示了平台工程的持续成熟,43%的受访者报告称他们的平台团队已经存在至少3-5年。 自2012年以来,Puppet 每年发布的关于 De…

深圳勘察设计协会网站国际货代做网站

第4章操作系统基础第五版Aimin.rar转载于:https://www.cnblogs.com/emanlee/archive/2010/10/14/1851101.html

知名的网站设计公司wordpress微信免签约支付插件

数据质量管理简介 数据质量管理是一个持续性的管理动作,有些人在做数据质量管理的时候会陷入一步到位的误区,想要通过一个工具、平台,或者一套质检规则就完成整体的数据质量管理,而实际数据质量管理从数据接入的那一刻就需要介入…

电子系统设计网站网站怎么添加软件

Nginx简介Nginx发展介绍Nginx作者正向代理和反向代理概念网站代理服务器查看Nginx环境搭建下载安装前准备安装启动检测Nginx是否启动关闭重启Nginx核心配置文件说明Nginx主要功能1、静态网站部署2、负载均衡负载均衡概述负载均衡实现方式Nginx负载均衡策略负载均衡其他配置3、静…

东莞黄江建设银行网站ps个人网站制作流程

下载opencv和opencv_contrib,cmake过程中要下载的一些包可以手动下载配置,如果网络较好,也可以等待自动下载。主要记录的是cmake命令: cmake -D CMAKE_BUILD_TYPERELEASE \-D BUILD_opencv_python3YES \-D CMAKE_INSTALL_PREFIX/…

软件公司网站模版网站备案号位置

如何在Python中实现设计模式? 设计模式是在软件开发中解决常见问题的最佳实践。它们提供了在特定上下文中对软件设计的重复使用性解决方案。Python,作为一种灵活且强大的编程语言,非常适合实现各种设计模式。下面,我将介…

Jenkins安装并与GitLab集成,实现dev、qa、uat、prod多分支持续集成的详细步骤 - 指南

Jenkins安装并与GitLab集成,实现dev、qa、uat、prod多分支持续集成的详细步骤 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; …

推荐系统中损失函数梳理:从Pointwise到Listwise

推荐系统中损失函数梳理:从Pointwise到Listwise推荐系统中的损失函数梳理:从Pointwise到Listwise 引言:目标决定损失函数选择 推荐系统通常采用两阶段架构:召回(Recall)与精排(Ranking)。两个阶段的优化目标存…

怎样免费建设免费网站wordpress如何做网站

新能源充电桩是智慧城市建设中不可缺少且可持续发展的重要设施,而工业4G路由器物联网应用为其提供了更加高效、智能、实时的管理方式。充电桩通过工业4G路由器可以与充电运营商的管理中心建立稳定的连接,实现双向数据传输,为用户提供优质的充…

网站子站怎么做、南宁建站热搜

链接&#xff1a;zoj 1115 或 hdoj 1013 或poj 1519 虽说是水题&#xff0c;却几经波折才搞定。该题目中的数字可能非常大&#xff0c;所以不能使用整型数&#xff0c;只能采用字符变量 代码如下&#xff1a; #include <stdio.h>int digitalRoot(int n); int digitS…

ZR 2025 十一集训 #1

100 + 70 + 0 + 0 = 170, Rank 38/101.良心模拟赛,吊打 MX。25十一集训day1 链接:link 题解:题目内 时间:4.5h (2025.10.03 08:30~13:00) 题目数:4 难度:A B C D\(\color{#52C41A} 绿\)*1600估分:100 + 90 + 0…

Channel-Driven 降低模块耦合设计复杂度

新手在 RTL 设计中往往以算法原型的功能为出发点,而低估了控制流的实现难度。实际开发过程中,算法功能对应的模块很快完成,而“黏合”模块间的控制流设计却迟迟不能按预期进度验证通过,不断延误开发周期 本人血淋淋…

how to download a websites favicon.ico

A site’s favicon is usually stored in one of a few predictable places, but it isn’t always straightforward. Here’s how you can grab it:1. Check the site’s HTMLOpen the website in your browser.Right…

JQuery CDN recommended

The URL you provided points to a specific version of the jQuery library (v2.0.0) hosted on Baidus CDN. However, Baidus CDN for jQuery has been deprecated for several years now, and its generally not re…

mini-spring实现

一、简介 基于bilibili up主“学java的生生”的手写spring教程,实现一个简单的spring框架。mini-spring包含的核心功能有:包扫描,BeanDefinition封装,IOC容器,依赖注入,生命周期管理,按类型/名称获取Bean等功能…

PML(Perfect Match Layer)介绍 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

手机自助网站建设企业门户是什么

接着这一问题衍生出来的问题 arcgis的MapServer服务查询出来的结果geometry坐标点带*的问题-CSDN博客 个人感觉像是server版本的问题&#xff0c;具体不清楚&#xff0c;pg数据库里面的shape点集合坐标点的精度是8&#xff0c;但是server服务查出来的默认都十几位。所以存在一…

揭阳装修网站建设数字资产交易网站建设

说明&#xff1a; 《火球——UML大战需求分析》是我撰写的一本关于需求分析及UML方面的书&#xff0c;我将会在CSDN上为大家分享前面几章的内容&#xff0c;总字数在几万以上&#xff0c;图片有数十张。欢迎你按文章的序号顺序阅读&#xff0c;谢谢&#xff01;本书已经在各大网…