我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Go语言学习之golang-jwt/jwt的教程分享

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

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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分为两部分

1.使用jwt.NewWithClaims生产jwt.ToKen

2.把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的教程分享的文章就介绍到这了,更多相关Go语言  golang-jwt/jwt内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

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

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

Go语言学习之golang-jwt/jwt的教程分享

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Go语言学习之golang-jwt/jwt的教程分享

jwt是 json web token的简称。go使用jwt目前,主流使用的jwt库是golang-jwt/jwt。本文就来和大家讲讲golang-jwt/jwt的具体使用,需要的可以参考一下
2023-01-14

分享Go语言学习资源与技术讨论的Golang社区版

随着互联网技术的快速发展,编程语言也成为了越来越多人关注的领域。作为一门功能丰富、易于学习的编程语言,Go语言越来越受到程序员们的青睐。在这个不断壮大的Golang社区,人们分享着Go语言学习资源、技术讨论和最新的开发趋势。本文就将介绍一些
分享Go语言学习资源与技术讨论的Golang社区版
2024-02-26

GO语言中通道和sync包的使用教程分享

这篇文章主要为大家详细介绍了Go语言中通道和sync包的相关资料,文中的示例代码讲解详细,对我们学习Go语言有一定的帮助,需要的可以参考一下
2023-02-24

学习go语言的有效资源利用和高效经验分享

有效利用资源,高效学习 Go 语言的建议和经验分享引言Go 语言因其简洁、高效和易于学习的特点而受到开发者的青睐。如果您想学习 Go 语言,那么您来对了地方。在本文中,我们将分享一些有效的资源和经验,帮助您高效地学习 Go 语言。1.
学习go语言的有效资源利用和高效经验分享
2024-02-01

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录