AI图像生成网站
目录
一、项目介绍
二、雪花算法
三、JWT认证与令牌桶算法
四、项目架构
五、图床上传与图像生成API搭建
六、项目测试与优化
三、JWT认证与令牌桶算法
在现代后端开发中,用户认证和接口限流是确保系统安全性和性能的两大关键要素。本文将基于实际代码,介绍 JWT 认证 和 令牌桶限流算法 的原理和实现。
1. JWT认证
JWT(JSON Web Token)是一种开放标准(RFC 7519),定义了一种紧凑的、自包含的方式,用于在各方之间安全地传输信息。这些信息经过签名验证后,可以信任其真实性。它通常用于用户认证场景,流程如下:
- 用户登录成功后,服务器生成一个JWT并返回给客户端。
- 客户端每次访问受保护的接口时,将JWT放入请求头中。
- 服务器解析JWT验证用户身份。
一个典型的JWT由三部分组成:
- Header:描述加密算法类型(如 HS256)。
- Payload(有效载荷):实际数据,例如用户信息和 Token 过期时间。
- Signature:通过密钥和 Header、Payload 签名生成,用于验证数据的完整性。
JWT 的标准声明只包含一些通用字段(如 exp
、iat
1),但在实际应用中,我们需要存储更多的业务数据,比如用户 ID 和用户名。
在 JWT 中,Payload 就是 Token 的核心数据部分,用来存储那些需要在两方之间传递的信息。它包含了自定义的声明(Claims),例如用户的标识(user_id)或过期时间(exp)。Payload 不会被加密,但会被签名以保证数据的完整性。我们可以自定义结构体 MyClaims
来实现自定义声明:
type MyClaims struct {
UserID uint64 `json:"user_id"`
Username string `json:"username"`
jwt.StandardClaims
}
之后,我们需要生成Access Token
和Refresh Token
来减少用户的重复登录行为,从而在保证安全性的同时提高交互体验,具体交互过程为:
用户登录阶段
- 用户在登录页面输入用户名和密码。
- 服务器验证用户的身份后,生成并返回:
- 一个短期有效的 Access Token。
- 一个长期有效的 Refresh Token。
- 客户端存储 Token(通常 Access Token 存在内存中,Refresh Token 存在安全存储区)。
生成 Access Token
和 Refresh Token
的函数如下:
// 定义Secret 用于加密的字符串
var mySecret = []byte("aidraw")
func GenToken(userID uint64, username string) (aToken, rToken string, err error) {
c := MyClaims{
UserID: userID,
Username: username,
StandardClaims: