本笔记将总结如何使用 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 测试工具进行测试:
-
注册用户:
- 请求方法:POST
- URL:http://localhost:8080/register
- 请求体:
{"username": "john_doe", "password": "password123"}
-
登录用户:
- 请求方法:POST
- URL:http://localhost:8080/login
- 请求体:
{"username": "john_doe", "password": "password123"}
你将会收到包含 JWT 令牌的响应。