使用 JWT(JSON Web Token)生成身份验证令牌的学习笔记 | 青训营

104 阅读2分钟

本笔记将总结如何使用 JWT(JSON Web Token)在 Go 语言中实现用户的登录和注册功能。我们将使用 Gin 框架来创建 Web 服务器,并使用 Gorm 框架来与数据库交互。

步骤 1:安装依赖

首先,我们需要安装以下依赖包:

go get -u github.com/gin-gonic/gin
go get -u github.com/dgrijalva/jwt-go
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

步骤 2:创建数据库

在 MySQL 数据库中创建一个名为 userdb 的数据库,用于存储用户信息。

步骤 3:实现用户注册和登录功能

以下是实现用户注册和登录功能的代码示例及说明:

type User struct {
	ID       uint `gorm:"primarykey;AUTO_INCREMENT"`
	Username string
	Password string
}

var db *gorm.DB
var secretKey = []byte("my_secret_key")

func main() {
	// 连接数据库
	dsn := "root:root12345@tcp(127.0.0.1:3306)/userdb?charset=utf8mb4&parseTime=True&loc=Local"
	var err error
	db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic("Failed to connect to database")
	}
	db.AutoMigrate(&User{})

	// 创建 Gin 引擎
	r := gin.Default()

	// 注册路由
	r.POST("/register", register)
	r.POST("/login", login)

	r.Run(":8080")
}

func register(c *gin.Context) {
	var user User
	if err := c.ShouldBindJSON(&user); err != nil {
		c.JSON(400, gin.H{"error": "Invalid input"})
		return
	}

	// 检查用户名是否已存在
	var existingUser User
	if err := db.Where("username = ?", user.Username).First(&existingUser).Error; err == nil {
		c.JSON(400, gin.H{"error": "Username already exists"})
		return
	}

	// 创建新用户
	db.Create(&user)

	c.JSON(200, gin.H{"message": "Registration successful"})
}

func login(c *gin.Context) {
	var input User
	if err := c.ShouldBindJSON(&input); err != nil {
		c.JSON(400, gin.H{"error": "Invalid input"})
		return
	}

	var user User
	if err := db.Where("username = ? AND password = ?", input.Username, input.Password).First(&user).Error; err != nil {
		c.JSON(401, gin.H{"error": "Invalid credentials"})
		return
	}

	// 生成 JWT 令牌
	token := generateJWTToken(user.ID)
	c.JSON(200, gin.H{"token": token})
}

func generateJWTToken(userID uint) string {
	claims := jwt.MapClaims{
		"user_id": userID,
		"exp":     time.Now().Add(time.Hour * 24).Unix(),
	}
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	signedToken, _ := token.SignedString(secretKey)
	return signedToken
}

说明:

  • 我们定义了一个 User 结构体来表示用户信息,并在数据库中创建了对应的表格。
  • register 函数中,我们首先检查输入的用户名是否已存在于数据库中,如果不存在,则创建新用户。
  • login 函数中,我们验证用户提供的用户名和密码是否匹配数据库中的记录,如果匹配,则生成 JWT 令牌并返回给用户。
  • 我们使用 generateJWTToken 函数来生成 JWT 令牌,其中包含用户ID和过期时间。

步骤 4:测试

使用 Postman 或其他 API 测试工具进行测试:

  1. 注册用户:

  2. 登录用户:

你将会收到包含 JWT 令牌的响应。