功能说明:
该代码实现了一个简单的登录认证系统,并使用Redis作为缓存。具体功能包括:
- 通过登录接口接收用户的用户名和密码,并验证用户名和密码是否正确,如果正确则生成一个JWT Token并返回给客户端。
- 定义了一个AuthMiddleware函数作为中间件,用于在请求到达处理函数之前对Token进行验证,并根据Token的内容进行一些逻辑判断,如Token是否过期、Token是否属于当前用户等。
- 注销登录接口用于清除当前登录用户的记录,并返回一个结果给客户端。
- 初始化Redis函数用于初始化Redis客户端,并进行一些基本的连接验证。
- 主函数中初始化了JWT密钥、已登录用户和Redis客户端,并创建了一个路由,定义了登录和注销登录的处理函数,并添加了AuthMiddleware中间件。最后使用gin.Default()启动HTTP服务器,监听在8080端口上
实现登录认证系统
1. 定义用户结构体
type User struct {
ID string `json:"id"`
Username string `json:"username"`
Email string `json:"email"`
}
2. 初始化JWT密钥
func InitJWTKey() {
pem, err := keys.GenerateRS256PrivateKey(2048)
if err != nil {
log.Fatal(err)
}
jwtKey, err := jwk.ParseRS256Key(pem)
if err != nil {
log.Fatal(err)
}
jwt.SetKey(jwtKey, "jwt")
}
3. 创建JWT Token
func CreateToken(username string) (string, error) {
return jwt.NewWithClaims("jwt", gin.H{
"user_id": username}).SignedString(jwtKey)
}
4. 鉴权中间件
func AuthMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
// 从请求头中获取Token
authHeader := c.GetHeader("Authorization")
if authHeader == "" {
c.JSON(http.StatusUnauthorized, gin.H{
"error": "Authorization header is missing"})
c.Abort()
return
}
tokenString := strings.TrimPrefix(authHeader, "Bearer ")
// 解析Token
token, err := jwt.Parse(tokenString)
if err != nil {
c.JSON(http.StatusUnauthorized, gin.H{
"error": "Invalid token"})
c.Abort()
return
5. 登录接口
func Login(c *gin.Context) {
// 解析请求参数
username := c.PostForm("username")
password := c.PostForm("password")
// 在此处根据用户名和密码查询用户信息,并判断是否登录成功
// 登录成功后,生成JWT Token
tokenString