JWT全称JSON Web Token是一种跨域认证解决方案,属于一个开放的标准,它规定了一种Token实现方式,目前多用于前后端分离项目和OAuth2.0业务场景下。
官网:https://jwt.io/
简而言之,jwt是一个签名的 JSON 对象,可以做一些有用的事情(例如,身份验证)。它通常用于Bearer
Oauth 2 中的令牌。令牌由三部分组成,由.
's 分隔。前两部分是 JSON 对象,已经过base64url编码。最后一部分是签名,以同样的方式编码。
第一部分称为标题。它包含验证最后一部分签名的必要信息。例如,使用哪种加密方法进行签名以及使用了什么密钥。
中间的部分是有趣的部分。它称为声明,包含您关心的实际内容。有关保留密钥和添加自己的正确方法的信息,请参阅RFC 。
值得一提的是,OAuth 和 JWT 不是一回事。JWT 令牌只是一个签名的 JSON 对象。它可以在任何有用的地方使用。但是,存在一些混淆,因为 JWT 是 OAuth2 身份验证中最常见的不记名令牌类型。
不用太深入,这里是对这些技术交互的描述:
有几种可用的签名方法,您可能应该花时间了解各种选项,然后再选择一种。主要的设计决策很可能是对称的还是非对称的。
对称签名方法(例如 HSA)仅使用一个密钥。这可能是最简单的签名方法,因为任何[]byte
都可以用作有效的秘密。它们在计算上的使用速度也略快一些,尽管这很少有关系。当令牌的生产者和消费者都受信任,甚至是同一个系统时,对称签名方法效果最好。由于相同的密钥用于签名和验证令牌,因此您无法轻松分发密钥以进行验证。
非对称签名方法(例如 RSA)使用不同的密钥来签名和验证令牌。这使得使用私钥生成令牌成为可能,并允许任何消费者访问公钥进行验证。
jwt-go
库支持 JWT 的解析和验证以及生成和签名。当前支持的签名算法是 HMAC SHA、RSA、RSA-PSS 和 ECDSA
每个签名方法都需要不同的对象类型作为其签名密钥。有关详细信息,请参阅软件包文档。以下是最常见的:
HS256
, HS384
, HS512
)[]byte
需要用于签名和验证的值RS256
, RS384
)RS512
期望*rsa.PrivateKey
用于签名和*rsa.PublicKey
验证ES256
, ES384
)ES512
期望*ecdsa.PrivateKey
用于签名和*ecdsa.PublicKey
验证go get github.com/dgrijalva/jwt-go
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)
}
//ParseToken 解析token的方法
func ParseToken(tokenString string) (*MyClaims, error<