• 使用Golong轻松实现JWT身份验证


    使用Golong轻松实现JWT身份验证

    JSON Web Tokens (JWT)是一种流行的安全方法,用于在两个方之间表示声明。在Web应用程序领域,它们通常用作从客户端向服务器传输身份信息(声明)的方式。本教程将引导您逐步实现Go应用程序中的JWT身份验证过程。

    1_30aoNxlSnaYrLhBT0O1lzw

    什么是JWT?

    JSON Web Token (JWT)是一种紧凑且URL安全的方式,用于在两个方之间传输声明。JWT中的声明被编码为一个JSON对象,并使用JSON Web Signature (JWS)进行数字签名。

    JWT通常的格式为:xxxxx.yyyyy.zzzzz

    • 头部:头部(xxxxx)通常由两部分组成:令牌类型JWT和签名算法。
    • 负载:负载(yyyyy)包含了声明。声明是关于主题(用户)的陈述。
    • 签名:要创建签名(zzzzz)部分,您需要使用编码后的头部、编码后的负载、一个密钥以及头部中指定的算法进行签名。

    Go环境设置

    首先,您需要一个用于在Go中处理JWT的软件包。我们将使用github.com/golang-jwt/jwt软件包。[1]

    在Go中生成JWT

    让我们创建一个生成JWT的函数:

    1. package main
    2. import (
    3. "fmt"
    4. "github.com/golang-jwt/jwt/v4"
    5. "time"
    6. )
    7. var mySigningKey = []byte("secretpassword")
    8. func GenerateJWT() (string, error) {
    9. token := jwt.New(jwt.SigningMethodHS256)
    10. claims := token.Claims.(jwt.MapClaims)
    11. claims["authorized"] = true
    12. claims["user"] = "John Doe"
    13. claims["exp"] = time.Now().Add(time.Minute * 30).Unix()
    14. tokenString, err := token.SignedString(mySigningKey)
    15. if err != nil {
    16. fmt.Errorf("Something went wrong: %s", err.Error())
    17. return "", err
    18. }
    19. return tokenString, nil
    20. }

    在Go中验证JWT

    现在,让我们验证JWT:

    1. func ValidateToken(tokenString string) (*jwt.Token, error) {
    2. token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
    3. if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
    4. return nil, fmt.Errorf("There was an error")
    5. }
    6. return mySigningKey, nil
    7. })
    8. if err != nil {
    9. return nil, err
    10. }
    11. return token, nil
    12. }

    在Go Web应用程序中使用JWT进行身份验证

    以下是一个简单示例,在Go的HTTP服务器中集成了JWT生成和验证:

    1. package main
    2. import (
    3. "fmt"
    4. "log"
    5. "net/http"
    6. )
    7. func HomePage(w http.ResponseWriter, r *http.Request) {
    8. validToken, err := GenerateJWT()
    9. if err != nil {
    10. fmt.Fprintf(w, err.Error())
    11. }
    12. clientToken := r.Header.Get("Token")
    13. if clientToken != validToken {
    14. w.WriteHeader(http.StatusUnauthorized)
    15. fmt.Fprintf(w, "Token is not valid")
    16. return
    17. }
    18. fmt.Fprintf(w, "Hello, World!")
    19. }
    20. func handleRequests() {
    21. http.HandleFunc("/", HomePage)
    22. log.Fatal(http.ListenAndServe(":9000", nil))
    23. }
    24. func main() {
    25. handleRequests()
    26. }

    使用此设置:

    • 服务器在访问主页时创建一个JWT。
    • 要进行验证,客户端需要在标头“Token”中发送相同的JWT。
    • 这只是一个基本示例。在实际情况中,您会在登录后生成一个令牌,并在每个需要身份验证的请求上进行检查。

    总结

    JWT提供了一种强大而灵活的方法来处理Web应用程序中的身份验证和授权。在Go中,借助像github.com/golang-jwt/jwt[2]这样的软件包,实现基于JWT的身份验证非常简单。但请记住,始终保持您的签名密钥保密,并在生产应用程序中使用安全的方法,最好是RSA,以增加安全性。

  • 相关阅读:
    Vue---监听div元素宽高改变时echart图表重新resize
    安全防御—— Virtual Private Network
    谷歌双标?拒绝给员工涨薪后,转头将高管工资提高到100万美元
    ICC2:ETM(extract timing model)
    c语言结构体数组
    拔掉网线后, 原本的 TCP 连接还存在吗?
    Python搜索书名获取整本资源_笔趣阁
    Python运算符 成员运算符、身份运算符,三目运算符
    数据结构02、顺序表和链表
    Learn Prompt-ChatGPT 精选案例:写作&博客
  • 原文地址:https://blog.csdn.net/m0_69824302/article/details/136692141