go语言beego框架jwt身份认证实现示例

作者:Jeff的技术栈 时间:2024-04-25 15:15:21 

一 引入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(&amp;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")
}

来源:https://www.cnblogs.com/guyouyin123/p/14085032.html

标签:go,beego,jwt,身份认证
0
投稿

猜你喜欢

  • 网站程序员如何应对web标准

    2007-05-11 16:52:00
  • 纯numpy卷积神经网络实现手写数字识别的实践

    2023-11-08 10:44:50
  • Python字体反爬实战案例分享

    2021-06-18 01:00:46
  • 如何以及何时使用sIFR

    2008-03-07 12:38:00
  • 使用Python中的reduce()函数求积的实例

    2021-08-14 04:35:47
  • python Selenium实现付费音乐批量下载的实现方法

    2023-02-28 17:26:58
  • OpenCV哈里斯(Harris)角点检测的实现

    2022-10-07 01:41:26
  • Javascript的错还是浏览器的问题——2009年为何显示为109年

    2009-01-11 18:19:00
  • 解决pandas read_csv 读取中文列标题文件报错的问题

    2023-04-16 06:54:37
  • Python和GO语言实现的消息摘要算法示例

    2023-03-27 02:07:05
  • python读取mysql数据绘制条形图

    2024-01-26 16:15:07
  • Numpy中创建数组的9种方式小结

    2021-03-25 21:39:43
  • MySQL explain根据查询计划去优化SQL语句

    2024-01-26 16:59:26
  • Python高阶函数与装饰器函数的深入讲解

    2023-10-04 12:42:41
  • python 解决mysql where in 对列表(list,,array)问题

    2024-01-27 06:34:23
  • Python一行代码识别发票并保存Excel示例详解

    2023-07-28 01:06:50
  • MySQL中对表连接查询的简单优化教程

    2024-01-25 19:15:49
  • Python用list或dict字段模式读取文件的方法

    2022-07-16 18:29:07
  • Go缓冲channel和非缓冲channel的区别说明

    2024-05-22 10:11:01
  • Python做屏幕录制工具的实现示例

    2021-06-17 09:29:23
  • asp之家 网络编程 m.aspxhome.com