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

如何在 Golang 中验证 JWE 令牌

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

如何在 Golang 中验证 JWE 令牌

问题内容

我有 2 个问题,但首先我想提供一些背景信息:

在我们的 web 应用程序上,我们使用 nextauth 生成 jwt 令牌,然后将其附加到针对 golang 服务器的请求(用于获取资源)。

生成的令牌似乎是通过 a256gcm 生成的 jwe 令牌。在我们的 golang 服务器中,我们想要验证令牌并提取它的一些自定义声明。也就是说,我们正在努力寻找一种解密方法。我们使用 go-jose 如下:

rawToken := `eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..aiIqD7-cU8Hu92F8.Kx2k99cyLYJR1P0xK_1wUsVO521T7kYSKx-OEutVJcpzbX27hZH0kh2MlBLxQHdmc8q4uXglhjl4JE3nTp_c6nOjga-faHyxYqKrZGJFLlu9MC4JVUWyonX6doFq0gl3UX9ABtP2t35Qly-w1qKH8BdG9x4iB1YM-yvs1w-HpBbMFQR7U7X4oHWIh_YJQlWADesYq6da7A97GSSXs2Go6yb7SH5WWd7iQzDu-UO6eg._PqujCUyMUqOkID80vJiDw`
key := []byte("thisisaverylongtextusedforhashing")

enc, err := jwt.ParseEncrypted(rawToken)
if err != nil {
    panic(err)
}

out := jwt.Claims{}
if err := enc.Claims(key, &out); err != nil {
    panic(err)
}
fmt.Printf("iss: %s, sub: %s\n", out.Issuer, out.Subject)

我们得到: panic:square/go-jose:加密原语中的错误

ps:我传递给用于 jwe 生成的 nextauth 的秘密:thisisaverylongtextusedforhashing

nextauth 输出的原始 jwe 令牌,我想在我的 golang 服务器中验证:eyjhbgcioijkaxiilcjlbmmioijbmju2r0nnin0..aiiqd7-cu8hu92f8.kx2k99cylyjr1p0xk_1wusvo521t7kyskx-oeutvjcpzbx27hzh0kh2m lblxqhdmc8q4uxglhjl4je3ntp_c6nojga-fahyxyqkrzgjfllu9mc4jvuwyonx6dofq0gl3ux9abtp2t35qly-w1qkh8bdg9x4ib1ym-yvs1w-hpbbmfqr7u7x4ohwih_yjqlwadesyq 6da7a97gssxs2go6yb7sh5wwd7iqzdu-uo6eg._pqujcuymuqokid80vjidw


正确答案


根据您的意见,我整理了一个可以帮助您解决问题的回复。首先,我使用了 ngopkg.in/go-jose/go-jose.v2 软件包的版本 2,因为(从我所看到的)算法 a256gcm 与应该是版本 3 的最新版本的软件包不完全兼容。您可以找到相关代码:

package main

import (
    "crypto/rand"
    "crypto/rsa"
    "fmt"
    "io"
    "os"
    "time"

    "github.com/golang-jwt/jwt"
    jose_jwt "gopkg.in/go-jose/go-jose.v2"
)

type CustomClaims struct {
    Username string `json:"username"`
    Password string `json:"password"`
    jwt.StandardClaims
}

func main() {
    privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
    if err != nil {
        panic(err)
    }

    // generate token
    token, err := generateToken()
    if err != nil {
        panic(err)
    }

    publicKey := &privateKey.PublicKey
    encrypter, err := jose_jwt.NewEncrypter(jose_jwt.A256GCM, jose_jwt.Recipient{
        Algorithm: jose_jwt.RSA_OAEP_256,
        Key:       publicKey,
    }, nil)
    if err != nil {
        panic(err)
    }

    plainText := []byte(token)
    object, err := encrypter.Encrypt(plainText)
    if err != nil {
        panic(err)
    }

    serialized := object.FullSerialize()

    object, err = jose_jwt.ParseEncrypted(serialized)
    if err != nil {
        panic(err)
    }

    decrypted, err := object.Decrypt(privateKey)
    if err != nil {
        panic(err)
    }

    fmt.Println(string(decrypted))

    // parse token
    claims, err := ValidateToken(string(decrypted))
    if err != nil {
        panic(err)
    }

    fmt.Println(len(claims))
}

这里,我们首先生成一个私钥来加密令牌,然后通过其公钥对其进行解密。为了简洁起见,我省略了用于生成和验证 jwt 令牌的代码。为了测试该解决方案,我向生成的令牌添加了两个自定义声明(在 customclaims 结构中定义的 usernamepassword)。然后,当我们解析令牌时,我们将能够检索它们的值。
如果这对您有帮助,请告诉我!

以上就是如何在 Golang 中验证 JWE 令牌的详细内容,更多请关注编程网其它相关文章!

免责声明:

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

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

如何在 Golang 中验证 JWE 令牌

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

下载Word文档

猜你喜欢

如何在 Golang 中验证 JWE 令牌

问题内容我有 2 个问题,但首先我想提供一些背景信息:在我们的 web 应用程序上,我们使用 nextauth 生成 jwt 令牌,然后将其附加到针对 golang 服务器的请求(用于获取资源)。生成的令牌似乎是通过 a256gcm
如何在 Golang 中验证 JWE 令牌
2024-02-06

如何在 Golang 中用正则表达式验证 JSON?

如何在 go 中使用正则表达式验证 json?定义正则表达式模式,确保字符串以花括号开头,包含键值对,键用引号括起,值可以是字符串、数组或嵌套对象。使用正则表达式包编译正则表达式。检查 json 字符串是否匹配正则表达式模式。如何在 Gol
如何在 Golang 中用正则表达式验证 JSON?
2024-05-13

如何在Discuz中完全取消验证码验证?

在Discuz中取消验证码验证,实际上是通过修改程序代码来实现的。用户可以通过以下步骤来完成这个过程:第一步:备份文件在开始修改代码之前,务必备份相关文件,以便在出现问题时可以恢复到原始状态。第二步:编辑程序代码打开Discuz的相关
如何在Discuz中完全取消验证码验证?
2024-03-10

ThinkPHP6如何使用表单令牌验证数据来源有效性

这篇文章主要为大家展示了“ThinkPHP6如何使用表单令牌验证数据来源有效性”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“ThinkPHP6如何使用表单令牌验证数据来源有效性”这篇文章吧。th
2023-06-22

如何使用正则表达式在 Golang 中验证电子邮件地址?

要使用正则表达式在 golang 中验证电子邮件地址,请执行以下步骤:使用 regexp.mustcompile 创建一个正则表达式模式,匹配有效的电子邮件地址格式。使用 matchstring 函数检查字符串是否与模式匹配。该模式涵盖了大
如何使用正则表达式在 Golang 中验证电子邮件地址?
2024-05-14

如何在java项目中利用google的身份验证器实现一个动态口令验证功能

这篇文章给大家介绍如何在java项目中利用google的身份验证器实现一个动态口令验证功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。google身份验证器的原理是什么呢?客户端和服务器事先协商好一个密钥K,用于一次
2023-05-31

如何在 xHTML 中验证 noscript+meta refresh 标签

这篇文章主要介绍了如何在 xHTML 中验证 noscript+meta refresh 标签,需要的朋友可以参考下
2023-03-15

如何在 golang 中的 SSH 中获取身份验证回调的连接字符串?

php小编柚子将为您介绍如何在golang中的SSH中获取身份验证回调的连接字符串。在SSH协议中,身份验证回调是一个重要的环节,它用于验证客户端的身份并建立安全的连接。为了获取身份验证回调的连接字符串,我们可以使用golang中的ssh包
如何在 golang 中的 SSH 中获取身份验证回调的连接字符串?
2024-02-09

如何在Android中获取短信验证码

这篇文章将为大家详细讲解有关如何在Android中获取短信验证码,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。package com.rain.messageandsend;import a
2023-05-30

如何在Golang中保证单例的唯一性?

标题:在Golang中保证单例的唯一性在编程中,单例模式是一种常见的设计模式,用于确保一个类只有一个实例,并提供全局访问点。在Golang中,我们可以通过使用sync包中的Once类型和sync.Once来实现单例模式,以确保单例的唯一性
如何在Golang中保证单例的唯一性?
2024-03-06

golang中gin框架接入jwt如何使用token验证身份

本篇内容介绍了“golang中gin框架接入jwt如何使用token验证身份”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!jwtjwt的原理
2023-06-22

如何在Golang中为Azure SDK指定x509证书

你在学习Golang相关的知识吗?本文《如何在Golang中为Azure SDK指定x509证书》,主要介绍的内容就涉及到,如果你想提升自己的开发能力,就不要错过这篇文章,大家要知道编程理论基础和实战操作都是不可或缺的哦!问题内容我正在尝试
如何在Golang中为Azure SDK指定x509证书
2024-04-04

如何在AmazeUI中使用JS表单验证框架

这期内容当中小编将会给大家带来有关如何在AmazeUI中使用JS表单验证框架,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、需求做一个内嵌到UTribe(一款Android App)的学生会活动报名系统
2023-06-09

如何在 PHP 中处理用户输入和验证

php 中的用户输入处理与验证:处理输入:使用 $_get、$_post 等访问用户输入。过滤输入:使用 filter_var() 函数去除不必要的字符。验证输入类型:使用 is_numeric() 验证数字,is_string() 等验证
如何在 PHP 中处理用户输入和验证
2024-05-02

如何在 Go 中使用不记名令牌发出请求

最近发现不少小伙伴都对Golang很感兴趣,所以今天继续给大家介绍Golang相关的知识,本文《如何在 Go 中使用不记名令牌发出请求》主要内容涉及到等等知识点,希望能帮到你!当然如果阅读本文时存在不同想法,可以在评论中表达,但是请勿使用过
如何在 Go 中使用不记名令牌发出请求
2024-04-04

如何在Flask中使用Flask-WTF实现邮箱验证

本篇文章为大家展示了如何在Flask中使用Flask-WTF实现邮箱验证,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1、使用Flask-WTF之前,需要安装一个扩展命令pip install fl
2023-06-14

在Access中如何只通过一个宏检验口令

  相信很多使用过Access的小伙伴都已经掌握了部分的宏控制程序,今天小编要和大家讲的是一个宏的实例检验口令,我们将会在这个实例中创建一个将包含条件的宏组,目的是用来实现对口令的检验,假如在口令正确的情况下,我们要先关闭这个身份核对窗口,再打开另一个窗体;相对的,在口令不正确的情况下,我们将会对出现信息框要求重新输入
在Access中如何只通过一个宏检验口令
2024-04-17

编程热搜

  • 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动态编译

目录