Go JWT RESTful身份认证教程

本文介绍了使用JWT(JSON Web Token)进行RESTful身份认证的教程,详细讲解了JWT的构成、登录处理、JWT-string生成及JWT中间件的实现。通过示例代码展示了如何在Go中创建和验证JWT,并对比了Cookie-Session与JWT的区别和适用场景。
摘要由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)
https://github.com/libragen/felix/blob/master/ssh2ws/ssh2ws.go

```go
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)


	{
   
		r.POST("comment-login", internal.LoginCommenter)       //评论用户登陆
		r.POST("comment-register", internal.RegisterCommenter) //评论用户注册
	}

	api :
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值