一、jwt添加到gin中
先把使用的包给导入到项目中
"github.com/dgrijalva/jwt-go"
创建一个生成 token的函数,注意要在这里设置一下 密令的内容和过期时间
const TokenExpireDuration = time.Hour * 2 // 密令过期时间
var mySecret = []byte("哈哈哈") // 密令
type User struct {
// 结构体
Uid int64 `json:"uid"`
Username string `json:"name"`
jwt.StandardClaims
}
func GenToken(userID int64, userName string) (string, error) {
// 创建一个我们自己的声明
c := User{
userID, // 自定义字段
userName,
jwt.StandardClaims{
ExpiresAt: time.Now().Add(TokenExpireDuration).Unix(), // 过期时间
Issuer: "hahaha", // 签发人
},
}
//生成一个 Token 的结构体实例
token := jwt.NewWithClaims(jwt.SigningMethodHS256,c)
//使用指定的secret签名并获得完整的编码后的字符串token
return token.SignedString(mySecret)
}
接着就要去调用这个生成函数了。我这里在登录成功后调用这个函数,然后生成token
为了测试,直接用静态数据进行传值了。
这里 在密令头部加上 Bearer。
Bearer是一个认证方案,用于指定请求中所有的身份验证类型。
Bearer 可以告诉服务器,请求中含有一个JWT Token,而不是其他类型的令牌或验证方式。
Bearer当做头部,可以让服务器和其他中间件处理程序采取相应的安全措施,比如就可以在传输过程中使用HTTPS加密
func LoginUser(context *gin.Context) {
Uid := 123
Username := "张三"
token,_ := utils.GenToken(int64(Uid),Username)
context.Header("Authorization","Bearer"+token)
}
然后将这个函数在路由中调用就可以了!
当这个Token添加到响应头中,如果我们想在项目的其他接口中 调用这个Token值的内容就可以了
然后通过解析获取 id
context.Request.Header.Get.("Authoriazation")
二、JWT的意义
使用场景
- 身份认证:JWT 可以用于用户身份认证,当用户成功登录后,服务器可以生成一个包含用户身份信息的 JWT 并返回给客户端,客户端在接下来的请求中携带这个 JWT,服务器可以通过验证 JWT 的签名来确认用户的身份信息,从而实现无状态的身份认证。
- 单点登录(SSO):在分布式系统中,JWT 可以用于实现单点登录,用户在登录成功后,可以获取一个 JWT,并在多个服务之间传递该 JWT,各个服务可以通过验证 JWT 来进行用户身份认证,从而实现用户在多个服务间的无缝登录体验。
- 授权:除了身份认证外,JWT 还可以用于授权,即确定用户是否有权访问特定资源或执行特定操作。在 JWT 中可以包含用户的权限信息,服务器可以根据 JWT 中的声明来判断用户是否具有相应的权限。
- 信息交换:由于 JWT 可以包含任意 JSON 格式的信息,并且通过数字签名保证了信息的完整性,因此它也可以在各方之间安全地传递信息。
优点
- 无需存储在服务器:JWT 将用户信息以 JSON 格式编码后嵌入到令牌中,因此不需要在服务器端维护会话状态,可以降低服务器的负担。
- 跨域支持:由于 JWT 可以在请求头或 URL 参数中传递,可以跨域使用,并且可以避免跨域请求时需要共享 Session ID 的问题。
- 扩展性:JWT 中可以包含任意 JSON 格式的数据,可以灵活地进行扩展,便于实现各种业务需求。
- 自包含性:JWT 中已包含了用户信息和数字签名,可以防止篡改和伪造,因此具有高度的自包含性和安全性。
- 简洁性:JWT 的长度比较短,可以通过 Base64 编码来压缩,节省网络带宽。
- 解耦合:由于 JWT 是无状态的,可以与任何后端服务进行解耦,方便进行微服务化架构设计。
jwt 和 session 的区别
- 储存位置:SESSION 是服务器端存储用户信息的一种机制,通常将用户信息保存在服务器上的内存或数据库中,并通过一个唯一的 Session ID 来与客户端进行关联。而 JWT 是基于令牌的机制,将用户信息以 JSON 格式编码后嵌入到令牌中,通常将令牌存储在客户端的 Cookie 或本地存储中。
- 状态管理:SESSION 依赖服务器端来维护用户的登录状态,服务器根据 Session ID 来查找对应的用户信息。而 JWT 是无状态的,令牌中已经包含了用户的身份信息,服务器不需要在自己的存储中查找任何信息,可以直接解析 JWT 来获取用户信息。
- 扩展性:SESSION 的扩展性较好,可以在服务器端灵活地操作会话数据,进行各种状态管理操作。而 JWT 的扩展性相对较差,因为 JWT 中已经包含了用户的信息,无法动态修改,如果需要更新用户信息,需要重新生成新的 JWT。
- 跨域支持:由于 SESSION 依赖于服务器端存储和检索用户信息,需要考虑跨域请求时如何共享 SESSION ID。而 JWT 可以在跨域请求中直接通过令牌来验证用户身份,避免了跨域共享 SESSION ID 的问题。
- 安全性:SESSION 的安全性取决于服务器端的实现和配置,如果服务器端的 SESSION 管理不当,可能会存在会话劫持、会话固定等安全风险。而 JWT 通过数字签名保证了令牌的完整性和真实性,可以防止篡改和伪造。