beego-jwt身份认证

目录

  • 一 引入jwt
  • 二 框架中引入jwt
  • 三 使用

jwt用户身份验证

go get github.com/dgrijalva/jwt-go

二 框架中引入jwt

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

三 使用

声明jwt需要用到的结构体

const (
	KEY                    string = "JWT-ARY-STARK"
	DEFAULT_EXPIRE_SECONDS int    = 600 //默认过期时间(s)
)

type User struct {
	Id   string `json:"id"`
	Name string `json:"json"`
}

// JWT -- json web token
// HEADER PAYLOAD SIGNATURE
// This struct is the PAYLOAD
type MyCustomClaims struct {
	User
	jwt.StandardClaims
}
1234567891011121314151617

封装方法

//刷新jwt token
func RefreshToken(tokenString string) (string, error) {
	// first get previous token
	token, err := jwt.ParseWithClaims(
		tokenString,
		&MyCustomClaims{},
		func(token *jwt.Token) (interface{}, error) {
			return []byte(KEY), nil
		})
	claims, ok := token.Claims.(*MyCustomClaims)
	if !ok || !token.Valid {
		return "", err
	}
	mySigningKey := []byte(KEY)
	expireAt := time.Now().Add(time.Second * time.Duration(DEFAULT_EXPIRE_SECONDS)).Unix()
	newClaims := MyCustomClaims{
		claims.User,
		jwt.StandardClaims{
			ExpiresAt: expireAt,
			Issuer:    claims.User.Name,
			IssuedAt:  time.Now().Unix(),
		},
	}
	// generate new token with new claims
	newToken := jwt.NewWithClaims(jwt.SigningMethodHS256, newClaims)
	tokenStr, err := newToken.SignedString(mySigningKey)
	if err != nil {
		fmt.Println("generate new fresh json web token failed !! error :", err)
		return "", err
	}
	return tokenStr, err
}

//验证jtw token
func ValidateToken(tokenString string) (info User, err error) {
	token, err := jwt.ParseWithClaims(
		tokenString,
		&MyCustomClaims{},
		func(token *jwt.Token) (interface{}, error) {
			return []byte(KEY), nil
		})
	if claims, ok := token.Claims.(*MyCustomClaims); ok && token.Valid {
		//fmt.Printf("%v %v", claims.User, claims.StandardClaims.ExpiresAt)
		//fmt.Println("token will be expired at ", time.Unix(claims.StandardClaims.ExpiresAt, 0))
		info = claims.User
	} else {
		fmt.Println("validate tokenString failed !!!", err)
	}
	return
}

//获取jwt token
func GenerateToken(info *User, expiredSeconds int) (tokenString string, err error) {
	if expiredSeconds == 0 {
		expiredSeconds = DEFAULT_EXPIRE_SECONDS
	}
	// Create the Claims
	mySigningKey := []byte(KEY)
	expireAt := time.Now().Add(time.Second * time.Duration(expiredSeconds)).Unix()
	fmt.Println("token will be expired at ", time.Unix(expireAt, 0))
	// pass parameter to this func or not
	user := *info
	claims := MyCustomClaims{
		user,
		jwt.StandardClaims{
			ExpiresAt: expireAt,
			Issuer:    user.Name,
			IssuedAt:  time.Now().Unix(),
		},
	}
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	tokenStr, err := token.SignedString(mySigningKey)
	if err != nil {
		fmt.Println("generate json web token failed !! error :", err)
	} else {
		tokenString = tokenStr
	}
	return
}

// return this result to client then all later request should have header "Authorization: Bearer <token> "
func getHeaderTokenValue(tokenString string) string {
	//Authorization: Bearer <token>
	return fmt.Sprintf("Bearer %s", tokenString)
}
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485

使用

//获取token
func (this *UserController) Get() {
	user := User{1, "gangan"}
	token, err := GenerateToken(&user, 0);
	if err != nil {
		fmt.Println(err)
	}else {
		//获取jwt
		this.Ctx.WriteString(token)
	}
}
//验证token
func (this *UserController) Check() {
	token := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwianNvbiI6ImdhbmdhbiIsImV4cCI6MTU3ODU1NDMyOCwiaWF0IjoxNTc4NTUzNzI4LCJpc3MiOiJnYW5nYW4ifQ.jOlMlfLMFBJvyrJTLagrwQx2931LzM7Z0EVMFZ75xYI"
	info, err := ValidateToken(token)
	if err != nil {
		this.Ctx.WriteString(err.Error())
		this.StopRun()
	}
	fmt.Println(info)
	this.Ctx.WriteString("success")
}

相关推荐:

Python JWT Token 的刷新机制

refresh_token通常不是标准jwt,可能是opaquetoken、对称加密串或数据库记录,直接pyjwt解码易报错;需先确认其格式与签名方式,否则应调用后端刷新接口。 refresh_token为什么不能直接用PyJWT解码验证? 因为refresh_token通常不走标准JWT签名验证流...

Python JWT 的 RS256 vs HS256 生产选型

rs256与hs256的本质区别在于:rs256是非对称签名(私钥签名、公钥验证),hs256是对称签名(同一密钥签名与验证),这决定了密钥管理、分发方式及系统部署架构。 RS256和HS256的本质区别在哪 核心就一点:RS256是非对称签名(私钥签、公钥验),HS256是对称签名(同一个密钥既签...

Python JWT 的安全隐患分析

JWT安全风险主要包括密钥管理不当致签名伪造、算法混淆攻击、Token未绑定上下文引发越权、以及敏感信息泄露与过度授权;需分别采取密钥安全托管、显式限定算法、增强上下文绑定、最小化Payload信息等措施。 密钥管理不当导致签名伪造 JWT的安全性高度依赖密钥的保密性。若使用HS256算法且密钥硬编...

fastapi 如何实现 token 刷新机制(不使用 jwt 库)

必须手动构造、签名和验证JWT或采用AES-CBC加密封装或纯Redis状态管理实现Token刷新。方案一基于hmac-sha256手动实现JWT三段式编解码与校验;方案二用AES-CBC加密JSON载荷并附加MAC;方案三以UUID为token,全量元数据存Redis查表校验。 如果您在FastA...

如何用代码实现Jwt 登录认证

如何用代码实现Jwt登录认证,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。基于nimbus-jose-jwt封装好了一个jwt,并且只需要自定义HandlerInterceptor实现类和WebMvcConfigurer...

基于Go语言实现的单点登录系统

参考:https://jwt.io/introduction/ 该单点登录是基于Go语言实现的单点登录系统,下面先简单介绍JWT JSONWebToken简述 JWT是一个开放的标准(RFC7519),它定义了一个紧凑且自包含的方式,用于在各方之间以JSON对象安全地传输信息.这些信息可以通过数字签...