go-zero中JWT的加密于解密

package jwt

import (
	"errors"
	"time"

	"github.com/golang-jwt/jwt/v4"
)

type (
	TokenOptions struct {
		AccessSecret string
		AccessExpire int64
		Fields       map[string]interface{}
	}
	Token struct {
		AccessToken  string `json:"access_token"`
		AccessExpire int64  `json:"access_expire"`
	}
)

func BuildTokens(opt TokenOptions) (Token, error) {
	var token Token
	now := time.Now().Add(-time.Minute).Unix()
	accessToken, err := getJwtToken(opt.AccessSecret, now, opt.AccessExpire, opt.Fields)
	if err != nil {
		return token, nil
	}
	token.AccessExpire = now + opt.AccessExpire
	token.AccessToken = accessToken
	return token, nil
}

// @secretKey: JWT 加解密密钥
// @iat: 时间戳
// @seconds: 过期时间,单位秒
// @payload: 数据载体
func getJwtToken(secretKey string, iat, seconds int64, payload map[string]interface{}) (string, error) {
	claims := make(jwt.MapClaims)
	claims["exp"] = iat + seconds
	claims["iat"] = iat
	for k, v := range payload {
		claims[k] = v
	}
	token := jwt.New(jwt.SigningMethodHS256)
	token.Claims = claims
	return token.SignedString([]byte(secretKey))
}

// ParseToken 解析 JWT
// @tokenString: 加密的token
// @mc: 解密后反写的实体  所以要传地址过去 方便反写
// t :  加密时的密钥
type claims struct {
	Mobile string
	jwt.MapClaims
}

func ParseToken(tokenString string, t string) (*claims, error) {
	mc := &claims{}
	// 解析token
	token, err := jwt.ParseWithClaims(tokenString, mc, func(token *jwt.Token) (i interface{}, err error) {
		return []byte(t), nil
	})
	if err != nil {
		return nil, errors.New("JWT已过期")
	}
	if token.Valid { // 校验token
		return mc, nil
	}
	return mc, errors.New("token校验失败")
}

主要函数为getJwtToken(生成token)、ParseToken(解密token)

getJwtToken生成token传入了token的密钥、过期时间、想要包含的数据,为了解密后进行使用,这一块主要在登录的时候进行使用,手机号为唯一标识

token, tokenErr := jwt.BuildTokens(jwt.TokenOptions{
		AccessSecret: l.svcCtx.Config.Auth.AccessSecret,
		AccessExpire: l.svcCtx.Config.Auth.AccessExpire,
		Fields: map[string]interface{}{
			"mobile": req.Mobile,
		},
	})

ParseToken解密token接受加密后的token、密钥,解出来的就是当时加密想要包含的数据
这一块是中间件中进行了使用,将token解密后,拿到唯一标识,去redis中获取,如果存在说明么有过期,如果不存在,还没有写 哈哈 ,做个笔记 自己记录一下

package middleware

import (
	"fmt"
	"go/application/basics/internal/config"
	"go/application/basics/service/redisClient"
	"go/pkg/jwt"
	"net/http"
)

type AuthInterceptorMiddleware struct {
}

func NewAuthInterceptorMiddleware() *AuthInterceptorMiddleware {
	return &AuthInterceptorMiddleware{}
}

func (m *AuthInterceptorMiddleware) Handle(next http.HandlerFunc) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		// TODO generate middleware implement function, delete after code implementation
		authRequest := r.Header.Get("Authorization")
		if authRequest == "" {
			w.WriteHeader(http.StatusAccepted)
			w.Write([]byte("请登录"))
			return
		}
		authParse, authErr := jwt.ParseToken(authRequest, config.GlobalConfig.Auth.AccessSecret)
		if authErr != nil {
			w.WriteHeader(http.StatusAccepted)
			w.Write([]byte(authErr.Error()))
		}
		redis := redisClient.Init(config.GlobalConfig)
		fmt.Println("redis--------------------------")
		fmt.Println(redis)
		val, redisErr := redis.Get(authParse.Mobile).Result()
		fmt.Println(val)
		fmt.Println(redisErr)
		// Passthrough to next handler if need
		next(w, r)
	}
}


 

ASP.NET Core使用JSON Web Tokens (JWT) 进行身份验证和授权通常涉及以下几个步骤: 1. **安装依赖**: 首先,你需要添加`Microsoft.AspNetCore.Authentication.JwtBearer` NuGet包,这将提供JWT的身份验证中间件。 ```shell dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer ``` 2. **配置服务**: 在`Startup.cs`的`ConfigureServices`方法中,注册JWT验证器并指定密钥: ```csharp services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.Audience = "your-audience"; options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your-secret-key")), ValidAudience = options.Audience, ValidIssuer = "your-issuer", ClockSkew = TimeSpan.Zero // 设置允许的时间差,这里为0秒以示严格校验 }; }); ``` 其中,`Audience`是接收令牌的应用程序名称,`Issuer`是签发令牌的颁发者,`IssuerSigningKey`是你用于加密解密令牌的密钥。 3. **授权控制**: 使用`Authorize`特性来标记需要验证的控制器或操作。例如,在控制器上添加: ```csharp [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] public class YourController : Controller { [HttpGet] public ActionResult<string> Get() { return "Hello, World!"; } } ``` 这个注解表示只有携带有效JWT权限的用户才能访问此方法。 4. **登录验证**: 用户登录成功后,应用应生成包含用户信息的JWT并将它返回给客户端。通常,你可以创建一个自定义的身份验证服务,处理用户的认证过程。 5. **客户端获取Token**: 客户端(如SPA、API Gateway或移动应用)在登录后会收到JWT,然后将其附加到HTTP请求头`Authorization`字段发送到服务器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值