Go语言学习笔记——jwt跨域鉴权

这篇博客介绍了如何在Golang中使用JWT进行跨域鉴权。内容涵盖了JWT的基本概念,包括JWT的组成部分和签名方法,以及在实际项目中的应用步骤,如生成和解析JWT,以及设置认证中间件。
摘要由CSDN通过智能技术生成


Golang jwt跨域鉴权

JWT全称JSON Web Token是一种跨域认证解决方案,属于一个开放的标准,它规定了一种Token实现方式,目前多用于前后端分离项目和OAuth2.0业务场景下。

jwt介绍

官网:https://jwt.io/

JWT 到底是什么?

简而言之,jwt是一个签名的 JSON 对象,可以做一些有用的事情(例如,身份验证)。它通常用于BearerOauth 2 中的令牌。令牌由三部分组成,由.'s 分隔。前两部分是 JSON 对象,已经过base64url编码。最后一部分是签名,以同样的方式编码。

第一部分称为标题。它包含验证最后一部分签名的必要信息。例如,使用哪种加密方法进行签名以及使用了什么密钥。

中间的部分是有趣的部分。它称为声明,包含您关心的实际内容。有关保留密钥和添加自己的正确方法的信息,请参阅RFC 。

JWT 和 OAuth

值得一提的是,OAuth 和 JWT 不是一回事。JWT 令牌只是一个签名的 JSON 对象。它可以在任何有用的地方使用。但是,存在一些混淆,因为 JWT 是 OAuth2 身份验证中最常见的不记名令牌类型。

不用太深入,这里是对这些技术交互的描述:

  • OAuth 是一种允许身份提供者与用户登录的服务分开的协议。例如,每当您使用 Facebook 登录不同的服务(Yelp、Spotify 等)时,您都在使用 OAuth。
  • OAuth 定义了几个用于传递身份验证数据的选项。一种流行的方法称为“不记名令牌”。不记名令牌只是一个字符串,只能由经过身份验证的用户持有。因此,只需出示此令牌即可证明您的身份。您可能可以从这里得出为什么 JWT 可能会成为一个好的不记名令牌。
  • 因为不记名令牌用于身份验证,所以对它们保密很重要。这就是使用不记名令牌的交易通常通过 SSL 发生的原因。

选择签名方法

有几种可用的签名方法,您可能应该花时间了解各种选项,然后再选择一种。主要的设计决策很可能是对称的还是非对称的。

对称签名方法(例如 HSA)仅使用一个密钥。这可能是最简单的签名方法,因为任何[]byte都可以用作有效的秘密。它们在计算上的使用速度也略快一些,尽管这很少有关系。当令牌的生产者和消费者都受信任,甚至是同一个系统时,对称签名方法效果最好。由于相同的密钥用于签名和验证令牌,因此您无法轻松分发密钥以进行验证。

非对称签名方法(例如 RSA)使用不同的密钥来签名和验证令牌。这使得使用私钥生成令牌成为可能,并允许任何消费者访问公钥进行验证。

签名方法和密钥类型

jwt-go库支持 JWT 的解析和验证以及生成和签名。当前支持的签名算法是 HMAC SHA、RSA、RSA-PSS 和 ECDSA

每个签名方法都需要不同的对象类型作为其签名密钥。有关详细信息,请参阅软件包文档。以下是最常见的:

  • HMAC 签名方法( HS256, HS384, HS512)[]byte需要用于签名和验证的值
  • RSA 签名方法( , RS256, RS384)RS512期望*rsa.PrivateKey用于签名和*rsa.PublicKey验证
  • ECDSA 签名方法( , ES256, ES384)ES512期望*ecdsa.PrivateKey用于签名和*ecdsa.PublicKey验证

安装jwt

go get github.com/dgrijalva/jwt-go

简单使用

生成JWT

type MyClaims struct {
   
	//除了满足下面的Claims,还需要以下用户信息
	Username string `json:"username"`
	Password string `json:"password"`
	//jwt中标准的Claims
	jwt.StandardClaims
}

// 使用指定的 secret 签名声明一个 key ,便于后续获得完整的编码后的字符串token
var key = []byte("secret")

//GenToken 生成token的方法
func GenToken(username string, password string) (string, error) {
   
	//创建一个我们自己的声明
	c := MyClaims{
   
		username, //自定义字段
		password,
		jwt.StandardClaims{
   
			ExpiresAt: time.Now().Add(time.Hour * 2).Unix(), //过期时间
			Issuer:    "Psych",                              //签发人
		},
	}

	//使用指定的签名方法创建签名对象
	//这里使用HS256加密算法
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, c)

	//注意这个地方的 key 一定要是字节切片不能是字符串
	return token.SignedString(key)
}

解析jwt

//ParseToken 解析token的方法
func ParseToken(tokenString string) (*MyClaims, error) {
   
	//解析token
	token, err := jwt.ParseWithClaims(tokenString, &MyClaims{
   },
		func(token *jwt.Token) (i interface{
   
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值