文章目录
JWT
JWT全称JSON Web Token是一种跨域认证解决方案,属于一个开放的标准,它规定了一种Token实现方式,目前多用于前后端分离项目和OAuth2.0业务场景下。
诺是不用这个JWT我们就需要去使用Cookie-Session模式实现用户认证。
流程为:
- 用户在浏览器端填写用户名和密码,并发送给服务端
- 服务端对
用户名和密码校验通过后会生成一份保存当前用户相关信息的session数据和一个与之对应的标识(通常称为session_id) - 服务端返回响应时将上一步的
session_id写入用户浏览器的Cookie - 后续用户来自该浏览器的每次请求都会自动携带包含
session_id的Cookie - 服务端通过请求中的
session_id就能找到之前保存的该用户那份session数据,从而获取该用户的相关信息。
这种方案依赖于客户端(浏览器)保存 Cookie,并且需要在服务端存储用户的session数据。
在移动互联网时代,我们的用户可能使用浏览器也可能使用APP来访问我们的服务,我们的web应用可能是前后端分开部署在不同的端口,有时候我们还需要支持第三方登录,这下Cookie-Session的模式就有些力不从心了。
JWT就是一种基于Token的轻量级认证模式,服务端认证通过后,会生成一个JSON对象,经过签名后得到一个Token(令牌)再发回给用户,用户后续请求只需要带上这个Token,服务端解密之后就能获取该用户的相关信息了。
安装JWT
我们使用 Go 语言社区中的 jwt 相关库来构建我们的应用,例如:https://github.com/golang-jwt/jwt
方法1:
go get github.com/golang-jwt/jwt/v4
方法2
import "github.com/golang-jwt/jwt/v4"
使用
什么是Claims
JWT token的 payload 部分是一个json串,是要传递数据的一组声明,这些声明被JWT标准称为claims。 JWT标准里面定义的标准claim包括:
iss(Issuser):JWT的签发主体;sub(Subject):JWT的所有者;aud(Audience):JWT的接收对象;exp(Expiration time):JWT的过期时间;nbf(Not Before):JWT的生效开始时间;iat(Issued at):JWT的签发时间;jti(JWT ID):是JWT的唯一标识
默认Claims
如果我们直接使用JWT中默认的字段,没有其他定制化的需求则可以直接使用这个包中的和方法快速生成和解析token。
// 用于签名的字符串
var mySigningKey = []byte("liwenzhou.com")
// GenRegisteredClaims 使用默认声明创建jwt
func GenRegisteredClaims() (string, error) {
// 创建 Claims
claims := &jwt.RegisteredClaims{
ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Hour * 24)), // 过期时间
Issuer: "qimi", // 签发人
}
// 生成token对象
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
// 生成签名字符串
return token.SignedString(mySigningKey)
}
// ParseRegisteredClaims 解析jwt
func ValidateRegisteredClaims(tokenString string) bool {
// 解析token
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{

本文介绍了如何在Go语言的Gin框架中使用JWT进行用户认证,包括JWT的安装、默认和自定义Claims的使用、生成和解析Token的过程,以及在Gin中设置中间件和注册路由的示例。
最低0.47元/天 解锁文章
5万+

被折叠的 条评论
为什么被折叠?



