go jwt实现token

博客涉及Go语言和JWT相关内容,Go语言是后端开发常用语言,JWT常用于身份验证和授权,在信息技术领域有重要应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package main

import (
	"fmt"
	"github.com/dgrijalva/jwt-go"//这里用的这个包
	"github.com/labstack/echo"
	"net/http"
	"time"
)

func main() {
	e := echo.New()
	e.GET("/", func(c echo.Context) error {
		token := jwt.New(jwt.SigningMethodHS256)//初始化token选择HS256
		clamis := token.Claims.(jwt.MapClaims)
		clamis["name"] = "zyq" //可以填写用户信息
		clamis["exp"] = time.Now().Add(time.Hour * 72).Unix()
		fmt.Println(clamis)
		key := []byte("secret")
		fmt.Println(key)
		t, err := token.SignedString(key)
		fmt.Println(err)
		return c.JSON(http.StatusOK, map[string]string{
			"token": t,
		})
	})

	e.Logger.Fatal(e.Start(":9991"))

}
//token解密参考 https://wingsxdu.com/post/golang/echo/go-echo-jwt/

 

### 使用Go语言实现JWT Token认证登录验证 #### 创建JWT Token 为了创建一个有效的JWT,在Go中通常使用第三方库`jwt-go`。首先定义密钥和过期时间,之后设置payload中的声明(claims),最后利用HMAC SHA256算法生成签名。 ```go package main import ( "fmt" "time" jwt "github.com/dgrijalva/jwt-go" ) func createToken(userId string) (string, error) { expirationTime := time.Now().Add(5 * time.Minute) claims := &Claims{ UserID: userId, StandardClaims: jwt.StandardClaims{ ExpiresAt: expirationTime.Unix(), }, } token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString([]byte("my_secret_key")) // 替换成实际使用的私钥[^1] } ``` #### 验证JWT Token 当接收到客户端发送过来的请求时,从中提取出携带的token字符串并调用Parse函数解析它;如果成功则返回对应的claim对象供后续业务逻辑处理。 ```go package main import ( "errors" "strings" jwt "github.com/dgrijalva/jwt-go" ) type Claims struct { UserID string `json:"user_id"` jwt.StandardClaims } func parseToken(tokenStr string) (*Claims, error) { if len(strings.TrimSpace(tokenStr)) == 0 { return nil, errors.New("empty token") } token, err := jwt.ParseWithClaims( tokenStr, &Claims{}, func(t *jwt.Token) (interface{}, error) { return []byte("my_secret_key"), nil }, // 替换成实际使用的公/私钥[^2] ) if err != nil || !token.Valid { return nil, err } if claims, ok := token.Claims.(*Claims); ok { return claims, nil } else { return nil, errors.New("invalid claim type") } } ``` #### 中间件集成 对于基于HTTP协议的应用程序来说,可以编写一个通用的中间件来自动完成上述过程。每当有新的HTTP请求到达服务器之前都会先经过这个过滤器检查是否存在合法的身份凭证。 ```go package middleware import ( "net/http" "github.com/gin-gonic/gin" ) // AuthMiddleware is a Gin middleware that checks the validity of tokens. func AuthMiddleware() gin.HandlerFunc { return func(c *gin.Context) { authHeader := c.GetHeader("Authorization") if authHeader == "" { c.JSON(http.StatusUnauthorized, gin.H{"error": "missing authorization header"}) c.Abort() return } parts := strings.Split(authHeader, " ") if !(len(parts) == 2 && parts[0] == "Bearer") { c.JSON(http.StatusBadRequest, gin.H{"error": "malformed authorization header"}) c.Abort() return } _, err := parseToken(parts[1]) if err != nil { c.JSON(http.StatusUnauthorized, gin.H{"error": "invalid or expired token"}) c.Abort() return } c.Next() } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值