Golang jwt跨域鉴权

Golang jwt跨域鉴权

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

安装jwt

go get github.com/dgrijalva/jwt-go

生成jwt

package main

import (
	"errors"
	"fmt"
	jwt "github.com/dgrijalva/jwt-go"
	"time"
)

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

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:    "Crisp",                              //签发人
		},
	}
  
	//使用指定的签名方法创建签名对象
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, c) //这里使用HS256加密算法
	//使用指定的secret签名并获得完整的编码后的字符串token
	// 注意这个地方一定要是字节切片不能是字符串
	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{
    
    }, err error) {
    
    
			return key, nil
		})
	if err != nil {
    
    
		return nil, err
	}

	if claims, ok := token.Claims.(*MyClaims); ok && token.Valid {
    
     //校验token
		return claims, nil
	}
	return nil, errors.New("invalid token")
}

调用生成token并解析token

func main() {
    
    
   //生成token
   token, err := GenToken("Crisp", "12345678")
   if err != nil {
    
    
      panic(err)
   }

   //解析token
   parseToken, err := ParseToken(token)
   if err != nil {
    
    
      panic(err)
   }
   fmt.Printf("parseToken.UserName: %v\n", parseToken.Username)
   fmt.Printf("parseToken.Password: %v\n", parseToken.Password)
}

代码运行结果

生成的token:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6IkNyaXNwIiwicGFzc3dvcmQiOiIxMjM0NTY3OCIsImV4cCI6MTY1ODcyNzQxNXNzIjoiQ3Jpc3AifQ.wXUoWlv8VeMJo_ezWSlsEO_XOfcwh3aD4Y_q0YoZfDg
解析token:
解析token获得:parseToken.UserName: Crisp
解析token获得:parseToken.Password: 12345678

猜你喜欢

转载自blog.csdn.net/weixin_51261234/article/details/125976840