脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - go语言beego框架jwt身份认证实现示例

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

2022-09-24 14:17Jeff的技术栈 Golang

这篇文章主要为大家介绍了go语言beego框架jwt身份认证实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪

一 引入jwt

jwt用户身份验证

?
1
go get github.com/dgrijalva/jwt-go

二 框架中引入jwt

?
1
2
3
4
5
6
import (
    "fmt"
    "github.com/astaxie/beego"
    "github.com/dgrijalva/jwt-go"
    "time"
)

三 使用

声明jwt需要用到的结构体

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

封装方法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
//刷新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

使用

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//获取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")
}

以上就是go语言beego框架jwt身份认证实现示例的详细内容,更多关于go beego框架jwt身份认证的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/guyouyin123/p/14085032.html

延伸 · 阅读

精彩推荐
  • Golanggolang 后台进程的启动和停止操作

    golang 后台进程的启动和停止操作

    这篇文章主要介绍了golang 后台进程的启动和停止操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    StellarCode5852021-05-29
  • GolangGo实现线程池(工作池)的两种方式实例详解

    Go实现线程池(工作池)的两种方式实例详解

    这篇文章主要介绍了Go实现线程池(工作池)的两种方式实例详解,需要的朋友可以参考下...

    骏马金龙4122022-09-23
  • GolangGo语言中字符串的查找方法小结

    Go语言中字符串的查找方法小结

    这篇文章主要介绍了Go语言中字符串的查找方法小结,示例的main函数都是导入strings包然后使用其中的方法,需要的朋友可以参考下 ...

    脚本之家14402020-04-27
  • GolangGo秒爬博客园100页新闻

    Go秒爬博客园100页新闻

    利用go语言的协程并发优势爬取网页速度相当之快,博客园100页新闻标题只需一秒即可全部爬取,跟着小编一起去看看如何实现的,希望大家可以从中受益...

    大囚长5252020-05-19
  • GolangGo 实现英尺和米的简单单位换算方式

    Go 实现英尺和米的简单单位换算方式

    这篇文章主要介绍了Go 实现英尺和米的简单单位换算方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    潘广宇 Leo7472021-06-08
  • GolangGolang正整数指定规则排序算法问题分析

    Golang正整数指定规则排序算法问题分析

    这篇文章主要介绍了Golang正整数指定规则排序算法问题,结合实例形式分析了Go语言排序算法操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下 ...

    books19581692020-05-05
  • Golang曹大带我学 Go之面向火焰图编程

    曹大带我学 Go之面向火焰图编程

    现实中听过各种面向 XX 编程,什么面向过程编程、面向对象编程;也有一些俏皮的,面向薪资编程、面向老板编程;之前曹大还写过一篇,面向事故编程。今...

    码农桃花源4232022-01-05
  • Golangvscode搭建go开发环境案例详解

    vscode搭建go开发环境案例详解

    对于Visual Studio Code开发工具,有一款优秀的GoLang插件,今天通过本文给大家介绍下vscode搭建go开发环境的详细教程,感兴趣的朋友跟随小编一起看看吧 ...

    呆萌小新@渊洁6012022-01-24