📌  相关文章
📜  golang jwt 示例 - Go 编程语言 - Go 编程语言(1)

📅  最后修改于: 2023-12-03 15:31:01.004000             🧑  作者: Mango

Golang JWT 示例

JWT (JSON Web Token) 是一种轻量级的认证机制,常用于在不同应用之间传递用户身份信息。在 Golang 中,可以使用 github.com/dgrijalva/jwt-go 库来处理 JWT。

安装

使用以下命令可以安装 jwt-go

go get github.com/dgrijalva/jwt-go
示例

现在,我们来看一个使用 JWT 认证机制的示例。

创建 Token

下面是一个用于创建 JWT Token 的函数:

import (
    "github.com/dgrijalva/jwt-go"
    "time"
)

func CreateToken(username string) (string, error) {
    token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
        "username": username,
        "exp":      time.Now().Add(time.Hour * 24).Unix(),
    })

    tokenString, err := token.SignedString([]byte("secretKey"))

    if err != nil {
        return "", err
    }

    return tokenString, nil
}
  • 首先,我们使用 jwt.NewWithClaims 创建一个新的 Token。

  • 这里指定使用 HS256 对 Token 进行签名,使用 jwt.MapClaims 映射需要存储在 Token 中的数据。

  • 然后,我们设置 Token 中的 username 字段以及过期时间 exp,这里的过期时间设置为当前时间加上 24 小时。

  • 最后,我们通过 SignedString 方法对 Token 进行签名生成最终的 Token 字符串。

解析 Token

下面是一个用于解析 JWT Token 的函数:

import (
    "github.com/dgrijalva/jwt-go"
    "time"
)

func ParseToken(tokenString string) (string, error) {
    token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
        if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
            return nil, fmt.Errorf("invalid signing method")
        }
        return []byte("secretKey"), nil
    })

    if err != nil {
        return "", err
    }

    if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
        if int64(claims["exp"].(float64)) < time.Now().Unix() {
            return "", fmt.Errorf("token is expired")
        }
        return claims["username"].(string), nil
    } else {
        return "", fmt.Errorf("invalid token")
    }
}
  • 首先,我们使用 jwt.Parse 方法解析传入的 Token 字符串。

  • 然后,我们定义了一个回调函数用于指定解密 Token 使用的密钥,这里对应的密钥为 "secretKey"。

  • 如果 Token 解析成功,我们检查 Token 是否过期,如果过期则返回相应的错误信息。

  • 如果没有过期,则从解析出的 Token 中提取出我们需要的 username 字段值并返回。

在 HTTP 请求中使用 Token

以下是一个使用 JWT Token 进行身份认证的 HTTP 请求示例:

import (
    "fmt"
    "net/http"
)

func AuthMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        tokenString := r.Header.Get("Authorization")

        if tokenString == "" {
            http.Error(w, "token is missing", http.StatusUnauthorized)
            return
        }

        username, err := ParseToken(tokenString)

        if err != nil {
            http.Error(w, err.Error(), http.StatusUnauthorized)
            return
        }

        // 在此处可以进行权限校验等逻辑处理

        next.ServeHTTP(w, r)
    })
}

func ProtectedHandler(w http.ResponseWriter, r *http.Request) {
    username := r.Context().Value("username").(string)

    fmt.Fprintf(w, "Hello %s!", username)
}

func main() {
    http.Handle("/protected", AuthMiddleware(http.HandlerFunc(ProtectedHandler)))

    if err := http.ListenAndServe(":8080", nil); err != nil {
        panic(err)
    }
}
  • 首先,我们定义了一个 AuthMiddleware 中间件,在 HTTP 请求中使用此中间件可以检查是否携带合法的 JWT Token。如果没有携带 Token 则返回相应的错误信息。

  • 如果 Token 检查通过,则将解析出的 username 添加到请求上下文中并将请求交由后续处理器处理。

  • ProtectedHandler 是一个受保护的接口,只有在通过了 JWT 认证机制后才能访问。在此处可以进行权限校验等逻辑处理。

  • 最后,我们使用 http.Handle 方法将接口与相应的中间件进行绑定并开启 HTTP 服务。

总结

本示例介绍了如何在 Golang 中使用 JWT 认证机制,以及如何将 JWT Token 应用于 HTTP 请求中进行身份认证。通过阅读本文,您应该对 JWT 在 Golang 开发中的应用有了更深入的了解。