使用Go语言实现登录认证系统(gin+redis)

功能说明:

该代码实现了一个简单的登录认证系统,并使用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
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值