golang的jwt鉴权用法

JWT原理

  1. JWT标准规范
    JWT(JSON Web Token)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。

一个JWT由三部分组成,头部、载荷与签名。

JWT原理类似我们加盖公章或手写签名的的过程,合同上写了很多条款,不是随便一张纸随便写啥都可以的,必须要一些证明,比如签名,比如盖章。JWT就是通过附加签名,保证传输过来的信息是真的,而不是伪造的。

头部:

用于说明签名的加密算法等,下面类型的json经过base64编码后得到JWT头部

{
  "typ": "JWT",
  "alg": "HS256"
}
载荷:

包含生成Token时间,过期时间,以及一些身份标识,标准定义了6个字段,载荷json经过base64编码后得到JWT的载荷:

sub: 该JWT所面向的用户
iss: 该JWT的签发者
iat(issued at): 在什么时候签发的token
exp(expires): token什么时候过期
nbf(not before):token在此时间之前不能被接收处理
jti:JWT ID为web token提供唯一标识

例子:
{
    "sub": "1",
    "iss": "http://localhost:8000/user/sign_up",
    "iat": 1451888119,
    "exp": 1454516119,
    "nbf": 1451888119,
    "jti": "37c107e4609ddbcc9c096ea5ee76c667"
}
签名:

将头部和载荷用’.'号连接,再加上一串密钥,经过头部声明的加密算法加密后得到签名

HMACSHA256(
    base64UrlEncode(header) + "." +
    base64UrlEncode(payload),
    secret
)
JWT Token

Token=头部+‘.’+载荷+‘.’+签名

代码实现JWT生成token,解析token

package jwt

import (
	"github.com/dgrijalva/jwt-go"
	"time"
	"github.com/jinzhu/gorm"
)
//定义user结构体
type User struct {
	gorm.Model
	Name      string `gorm:"type:varchar(20);not null;" json:"name" form:"name" validate:"-"`
	Telephone string `gorm:"type:varchar(11);not null;unique" json:"telephone" form:"telephone" validate:"required,len=11"`
	Password  string `gorm:"type:varchar(200);not null;" json:"password" form:"password" validate:"required,gt=6"`
}

//secret 服务端证书 注意不要泄露
var jwtSecret = []byte("a_secret_cret")

type Claims struct {
	UserId uint
	jwt.StandardClaims
}

// ReleaseToken 生成token
func ReleaseToken(user User) (string, error) {
	expirationTime := time.Now().Add(7 * 24 * time.Hour)
	claims := &Claims{
		UserId: user.ID,
		StandardClaims: jwt.StandardClaims{
			ExpiresAt: expirationTime.Unix(), //过期时间
			IssuedAt:  time.Now().Unix(),     //发放时间
			Issuer:    "yan.com",             //发放作者
			Subject:   "user token",          //主题
		},
	}
	//声明加密类型,使用HS256算法,创建token体
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	//传一个服务端jwtSecret证书字符串进去,进行加密
	tokenString, err := token.SignedString(jwtSecret)
	if err != nil {
		return "", err
	}
	return tokenString, nil
}

// ParseToken 解析token
func ParseToken(tokenString string) (*jwt.Token, *Claims, error) {
	claims := &Claims{}
	token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {
		return jwtSecret, nil
	})

	return token, claims, err
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值