go token验证_详解Go-JWT-RESTful身份认证教程

本文详细讲解了如何使用Go语言和Gin框架实现JWT(JSON Web Token)身份认证。介绍了JWT的原理,构成,以及如何在前端和后端进行JWT的解析和验证。在后端,通过Gin框架创建登录接口,并展示了登录接口的处理函数,包括用户验证、密码处理和JWT字符串的生成。同时,文章提到了JWT与Cookie-Session的区别和适用场景。
摘要由CSDN通过智能技术生成

1.什么是JWT

JWT(JSON Web Token)是一个非常轻巧的规范,这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息,

一个JWT由三部分组成,Header头部、Claims载荷、Signature签名,

JWT原理类似我们加盖公章或手写签名的的过程,合同上写了很多条款,不是随便一张纸随便写啥都可以的,必须要一些证明,比如签名,比如盖章,JWT就是通过附加签名,保证传输过来的信息是真的,而不是伪造的,

它将用户信息加密到token里,服务器不保存任何用户信息,服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证,

2.JWT构成

一个JWT由三部分组成,Header头部、Claims载荷、Signature签名,

Header头部:头部,表明类型和加密算法

Claims载荷:声明,即载荷(承载的内容)

Signature签名:签名,这一部分是将header和claims进行base64转码后,并用header中声明的加密算法加盐(secret)后构成,即:

let tmpstr = base64(header)+base64(claims)

let signature = encrypt(tmpstr,secret)

//最后三者用"."连接,即:

let token = base64(header)+"."+base64(claims)+"."+signature

3.javascript提取JWT字符串荷载信息

JWT里面payload可以包含很多字段,字段越多你的token字符串就越长.

你的HTTP请求通讯的发送的数据就越多,回到之接口响应时间等待稍稍的变长一点点.

一下代码就是前端javascript从payload获取登录的用户信息.

当然后端middleware也可以直接解析payload获取用户信息,减少到数据库中查询user表数据.接口速度会更快,数据库压力更小.

后端检查JWT身份验证时候当然会校验payload和Signature签名是否合法.

let tokenString = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1Njc3Nzc5NjIsImp0aSI6IjUiLCJpYXQiOjE1Njc2OTE1NjIsImlzcyI6ImZlbGl4Lm1vam90di5jbiIsImlkIjo1LCJjcmVhdGVkX2F0IjoiMjAxOS0wOS0wNVQxMTo1Njo1OS41NjI1NDcwODYrMDg6MDAiLCJ1cGRhdGVkX2F0IjoiMjAxOS0wOS0wNVQxNjo1ODoyMC41NTYxNjAwOTIrMDg6MDAiLCJ1c2VybmFtZSI6ImVyaWMiLCJuaWNrX25hbWUiOiIiLCJlbWFpbCI6IjEyMzQ1NkBxcS5jb20iLCJtb2JpbGUiOiIiLCJyb2xlX2lkIjo4LCJzdGF0dXMiOjAsImF2YXRhciI6Ii8vdGVjaC5tb2pvdHYuY24vYXNzZXRzL2ltYWdlL2F2YXRhcl8zLnBuZyIsInJlbWFyayI6IiIsImZyaWVuZF9pZHMiOm51bGwsImthcm1hIjowLCJjb21tZW50X2lkcyI6bnVsbH0.tGjukvuE9JVjzDa42iGfh_5jIembO5YZBZDqLnaG6KQ'

function parseTokenGetUser(jwtTokenString) {

let base64Url = jwtTokenString.split('.')[1];

let base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');

let jsonPayload = decodeURIComponent(atob(base64).split('').map(function (c) {

return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);

}).join(''));

let user = JSON.parse(jsonPayload);

localStorage.setItem("token", jwtTokenString);

localStorage.setItem("expire_ts", user.exp);

localStorage.setItem("user", jsonPayload);

return user;

}

parseTokenGetUser(tokenString)

复制上面javascript代码到浏览器console中执行就可以解析出用户信息了! 当然你要可以使用在线工具来解析jwt token的payload荷载

JWT在线解析工具

4. go语言Gin框架实现JWT用户认证

接下来我将使用最受欢迎的gin-gonic/gin和 dgrijalva/jwt-go

这两个package来演示怎么使用JWT身份认证.

4.1 登录接口

4.1.1 登录接口路由(login-route)

r := gin.New()

r.MaxMultipartMemory = 32 << 20

//sever static file in http's root path

binStaticMiddleware, err := felixbin.NewGinStaticBinMiddleware("/")

if err != nil {

return err

}

//支持跨域

mwCORS := cors.New(cors.Config{

AllowOrigins: []string{"*"},

AllowMethods: []string{"PUT", "PATCH", "POST", "GET", "DELETE"},

AllowHeaders: []string{"Origin", "Authorization", "Content-Type"},

ExposeHeaders: []string{"Content-Type"},

AllowCredentials: true,

AllowOriginFunc: func(origin string) bool {

return true

},

MaxAge: 2400 * time.Hour,

})

r.Use(binStaticMiddleware, mwCORS)

{<

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值