文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Go语言的golang-jwt/jwt库怎么使用

2023-07-04 23:57

关注

本文小编为大家详细介绍“Go语言的golang-jwt/jwt库怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Go语言的golang-jwt/jwt库怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

一、介绍

jwt是 json web token的简称。

go使用jwt目前,主流使用的jwt库是golang-jwt/jwt

1.1 如何安装

go get -u github.com/golang-jwt/jwt/v4

1.2 import到项目里

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

1.3 主流2类加密算法介绍

加密算法代表算法加解密
对称加密算法(hash加密) hsaHS256(最常用), HS384, HS512期望[]byte用于签名和验证的值
非对称签名方法 rsaRS256(最常用), RS384,RS512rsa.PrivateKey用于签名和*rsa.PublicKey验证

二、代码实现 -对称加密 hsa(hash加密)

2.1 加密生成token

我们使用 NewWithClaims(method SigningMethod, claims Claims) *Token来生成token,官方的源码如下

// NewWithClaims creates a new Token with the specified signing method and claims.func NewWithClaims(method SigningMethod, claims Claims) *Token {    return &Token{        Header: map[string]interface{}{            "typ": "JWT",            "alg": method.Alg(),        },        Claims: claims,        Method: method,    }}

其中我们需要 传入一个 SigningMethod 加密算法,以及一个 Claims,需要加密的内容。

SigningMethod 我们这里使用 hsa256 哈希加盟

Claims 我们封装一个 UserClaims 如下

我们调用NewWithClaims生成token代码如下:

func TestHs256(t *testing.T) {    type User struct {        Id   int64        Name string    }    type UserClaims struct {        User User        jwt.RegisteredClaims    }    // 1 jwt.NewWithClaims生成token    user := User{        Id:   101,        Name: "hisheng",    }    userClaims := UserClaims{        User:             user,        RegisteredClaims: jwt.RegisteredClaims{},    }    token := jwt.NewWithClaims(jwt.SigningMethodHS256, userClaims)    // 2 把token加密    mySigningKey := []byte("ushjlwmwnwht")    ss, err := token.SignedString(mySigningKey)    t.Log(ss, err)}

生成token分为两部分

使用jwt.NewWithClaims生产jwt.ToKen

把jwt.ToKen加密(这里我们需要添加一个加密key,使用base64url加密)

最后我们就得到了加密后的token,可以用来给客户端使用。

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VyIjp7IklkIjoxMDEsIk5hbWUiOiJoaXNoZW5nIn19.ij1kWID03f_CiELe0fPLZJ-Y64dkf2nDE-f6nGERBSE

token令牌由三部分组成,由.分隔。

前两部分是 JSON 对象,已经过base64url编码。

最后一部分是签名,以相同的方式编码。

2.2 解密token得到原始数据

我们使用官方的jwt.ParseWithClaims()来解密token,官方文档源代码如下:

func TestHs256Parse(t *testing.T) {    tokenString := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VyIjp7IklkIjoxMDEsIk5hbWUiOiJoaXNoZW5nIn19.ij1kWID03f_CiELe0fPLZJ-Y64dkf2nDE-f6nGERBSE"    type User struct {        Id   int64        Name string    }    type UserClaims struct {        User User        jwt.RegisteredClaims    }    token, err := jwt.ParseWithClaims(tokenString, &UserClaims{}, func(token *jwt.Token) (interface{}, error) {        return []byte("ushjlwmwnwht"), nil    })    if userClaims, ok := token.Claims.(*UserClaims); ok && token.Valid {        t.Log(userClaims, userClaims.RegisteredClaims.Issuer)    } else {        t.Log(err)    }}

jwt.ParseWithClaims是parser.ParseWithClaims封装,可以自己再封装一个parser,上面的代码可以用下面的代码代替。

func TestHs256Parse2(t *testing.T) {    tokenString := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VyIjp7IklkIjoxMDEsIk5hbWUiOiJoaXNoZW5nIn19.ij1kWID03f_CiELe0fPLZJ-Y64dkf2nDE-f6nGERBSE"    type User struct {        Id   int64        Name string    }    type UserClaims struct {        User User        jwt.RegisteredClaims    }    parser := jwt.NewParser()    token, err := parser.ParseWithClaims(tokenString, &UserClaims{}, func(token *jwt.Token) (interface{}, error) {        return []byte("ushjlwmwnwht"), nil    })    if userClaims, ok := token.Claims.(*UserClaims); ok && token.Valid {        t.Log(userClaims, userClaims.RegisteredClaims.Issuer)    } else {        t.Log(err)    }}

我们在 parser := jwt.NewParser()的时候,可以带上参数,比如parser := jwt.NewParser(WithoutClaimsValidation)// 跳过声明验证(验证过期时间、发表时间、在此之前时间)

三、代码实现 -非对称加密 rsa(我们这里使用rsa256)

2.1 生成 rsa 私钥和公钥

生成私钥

openssl genrsa -out private-key.pem

生成公钥

openssl rsa -in private-key.pem -pubout -out public-key.pem

2.2 加密生成token

func TestRs256(t *testing.T) {    type User struct {        Id   int64        Name string    }    type UserClaims struct {        User User        jwt.RegisteredClaims    }    // 1 jwt.NewWithClaims生成token    user := User{        Id:   101,        Name: "hisheng",    }    userClaims := UserClaims{        User:             user,        RegisteredClaims: jwt.RegisteredClaims{},    }    // Read Private Key    privateKeyDataPem, err := ioutil.ReadFile("private-key.pem")    if err != nil {        log.Fatal(err)    }    // ParseRSAPrivateKeyFromPEM    privateKeyData, err := jwt.ParseRSAPrivateKeyFromPEM(privateKeyDataPem)    if err != nil {        log.Fatal(err)    }    // 2 把token加密    token, err := jwt.NewWithClaims(jwt.SigningMethodRS256, userClaims).SignedString(privateKeyData)    t.Log(token, err)}

2.2 解密token

func TestRs256Parse(t *testing.T) {    tokenString := "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VyIjp7IklkIjoxMDEsIk5hbWUiOiJoaXNoZW5nIn19.GOS-d7iwaLDCSaSsBpArbtH-3JlD1KFNoJeyZjQ6Xv4XySo599WY784mVj-rR9kxtLYmkdAG3dPG9am6NZubHBLYWDi9b1w5gXcC7o3nAZirFGgS7bwf-7DmEetwUWzJZe-QXr1CIiVyHPU2ZCketYkIqgMGixVNfxfS5pJ5LhiUM_7J9Zlf5Kq15P9Y7U35Nu25-UXGgs-BHvH-Db6PJ4vHZq-dla_yuqRN276JBxdc24SEnML_iOHmgXVOXEWjtC_p6LmsP0VGMqwXAHN4FH0XbMzpQtTQKJgskggI41T1Ruzb9zpzJdmiL2DkeMgbvc0xVzV3CjM_AA5cUqcZaQ"    type User struct {        Id   int64        Name string    }    type UserClaims struct {        User User        jwt.RegisteredClaims    }    token, err := jwt.ParseWithClaims(tokenString, &UserClaims{}, func(token *jwt.Token) (interface{}, error) {        // Read public Key        publicKeyDataPem, err := ioutil.ReadFile("public-key.pem")        if err != nil {            log.Fatal(err)        }        // ParseRSAPublicKeyFromPEM        return jwt.ParseRSAPublicKeyFromPEM(publicKeyDataPem)    })    if userClaims, ok := token.Claims.(*UserClaims); ok && token.Valid {        t.Log(userClaims, userClaims.RegisteredClaims.Issuer)    } else {        t.Log(err)    }}

读到这里,这篇“Go语言的golang-jwt/jwt库怎么使用”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯