博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
golang中的JWT
阅读量:3986 次
发布时间:2019-05-24

本文共 2331 字,大约阅读时间需要 7 分钟。

JWT是一种协议,和语言无关,只需要按照协议来加密和解析即可,但是golang是强类型的,所以自定义的claims中的各字段要正确定义,否则无法解析。

首先需要设置加密算法(比如 HS256)和 JWT Secret。

当拿到一个JWT Token之后可以先查看其三个部分的定义。

在这里插入图片描述

关于JWT的原理可以参考

也就是说,通过JWT Token 就可以知道算法(第一部分)和claims(第二部分)。

生成token和解析token

/*-- @Time : 2020/9/27 16:34-- @Author : raoxiaoya-- @Desc : jwt parser for laravel jwt*/package jwtimport (	"fmt"	"github.com/dgrijalva/jwt-go"	"time"	"voteapi/pkg/setting"	"voteapi/pkg/util")type CustomClaims struct {
Iss string `json:"iss,omitempty"` Iat int64 `json:"iat,omitempty"` Exp int64 `json:"exp,omitempty"` Nbf int64 `json:"nbf,omitempty"` Jti string `json:"jti,omitempty"` Sub int64 `json:"sub,omitempty"` Prv string `json:"prv,omitempty"`}func (c CustomClaims) Valid() error {
// 过期时间 if time.Now().Unix() > c.Exp {
return fmt.Errorf("the token is expired") } // 颁发者 //if c.Iss != setting.JwtConfig.JWTIss {
// return fmt.Errorf("the token is invalid") //} // 私钥 //if c.Prv != setting.JwtConfig.JWTPrv {
// return fmt.Errorf("the token is invalid") //} return nil}func CreateToken(userId int64, phone string) string {
curr := time.Now().Unix() customClaims := &CustomClaims{
Iss: setting.JwtConfig.JWTIss, Iat: curr, Exp: curr + setting.JwtConfig.JWTExpire, Nbf: curr + setting.JwtConfig.JWTExpire, Jti: util.RandString(20), Sub: userId, Prv: setting.JwtConfig.JWTPrv, } // 采用HMAC SHA256加密算法 token := jwt.NewWithClaims(jwt.SigningMethodHS256, customClaims) tokenString, err := token.SignedString([]byte(setting.JwtConfig.JWTSecret)) if err != nil {
panic(err) } return tokenString}func ParseToken(tokenString string) (*CustomClaims, error) {
token, err := jwt.ParseWithClaims(tokenString, &CustomClaims{
}, func(token *jwt.Token) (interface{
}, error) {
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, fmt.Errorf("Unexpected signing method: %s", token.Header["alg"]) } return []byte(setting.JwtConfig.JWTSecret), nil }) if err != nil || token == nil {
return nil, err } if claims, ok := token.Claims.(*CustomClaims); ok && token.Valid {
return claims, nil } else {
return nil, err }}

配置项

[jwt]JWTExpire = 3600JWTSecret = 4N1BhLGdpFK5F2AH1txDOrlEFSs5adetJWTIss = http://172.31.205.102/uc/ucenter/answerLoginByCodeJWTPrv = f6b71549db8c2c42b75827aa44f02b7ee529d24d

在Valid方法中添加额外的校验规则。

Sub 字段存储了最终的信息。

转载地址:http://dcaui.baihongyu.com/

你可能感兴趣的文章
mysql字符集
查看>>
Missing artifact org.apache.qpid:proton-jms:jar:0.3.0-fuse-2
查看>>
mysql索引及sql优化
查看>>
eclipse创建maven war项目不能自动生成web.xml
查看>>
在虚拟机中安装Centos6.5
查看>>
Xshell使用教程
查看>>
Linux学习(一)
查看>>
数据结构与算法(1)-算法时间复杂度
查看>>
数据结构和算法(2)-栈与队列
查看>>
linux学习(二)
查看>>
一千行 MySQL 学习笔记
查看>>
linux下导出导入.sql文件
查看>>
linux下安装jdk及tomcat
查看>>
TCP 协议-滑动窗口
查看>>
浅谈Nginx负载均衡与F5的区别
查看>>
登五云山
查看>>
linux下安装zookeeper
查看>>
Go学习(1):简介和配置
查看>>
Go学习(2):基本语法
查看>>
Go学习(3):分支循环
查看>>