Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > golang整合jwt

golang整合jwt的实现示例

作者:code:404-not-found

json web tokens(jwt)已成为大多数web api设计中的常见身份验证和授权方案之一,本文主要介绍了golang整合jwt的实现示例,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧

快速开始

下载包

go get github.com/dgrijalva/jwt-go

直接上代码

package main

import (
	"fmt"
	"time"

	"github.com/dgrijalva/jwt-go"
)

// 定义一个结构体 实现jwt.StandardClaims
type MyClaims struct {
	UserName string
	jwt.StandardClaims
}

const (
	SECRETKEY = "ghdrgdrgdrg34" //私钥
)

func main() {
	// 生成token
	token, _ := GenerateToken()

	// 解析token
	c2, err := ParseToken(token)
	if err != nil {
		fmt.Println("token解析失败", err.Error())
	}
	fmt.Println(c2.UserName)
}

// 生成token
func GenerateToken() (string, error) {
	maxAge := 60 * 60 * 24
	c := MyClaims{
		UserName: "用户名",
		StandardClaims: jwt.StandardClaims{
			ExpiresAt: time.Now().Add(time.Duration(maxAge) * time.Second).Unix(), // 过期时间
			NotBefore: time.Now().Unix(),                                          // 生效时间
			Issuer:    "本人",                                                       // 签发人
		},
	}
	// method 加密方法 工作多用jwt.SigningMethodRS256
	// claims 实现Claims接口的结构体

	token := jwt.NewWithClaims(jwt.SigningMethodHS256, c)

	// 用私钥加密token
	tokenStr, err := token.SignedString([]byte(SECRETKEY))
	return tokenStr, err
}

// 解析token
func ParseToken(tokenString string) (*MyClaims, error) {
	token, err := jwt.ParseWithClaims(tokenString, &MyClaims{}, func(token *jwt.Token) (interface{}, error) {
		if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
			return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"])
		}
		return []byte(SECRETKEY), nil
	})
	if claims, ok := token.Claims.(*MyClaims); ok && token.Valid {
		return claims, nil
	} else {
		return nil, err
	}
}

整合gin框架

package main

import (
	"fmt"
	"log"
	"time"

	"github.com/dgrijalva/jwt-go"
	"github.com/gin-gonic/gin"
)

// 定义一个结构体 实现jwt.StandardClaims
type MyClaims struct {
	UserName string
	jwt.StandardClaims
}

// 定义一个结构体 用来接收请求参数
type LoginData struct {
	User     string `form:"user" binding:"required"`
	Password string `form:"password" binding:"required"`
}

const (
	SECRETKEY = "ghdrgdrgdrg34" //私钥
)

// 验证token是否合法,合法则放行
func VerificationToken(c *gin.Context) {
	token := c.Request.Header.Get("token")
	log.Println(token)
	myClaims, err := ParseToken(token)
	if err != nil {
		c.JSON(401, gin.H{"status": err.Error()})
		c.Abort()
	} else {
		c.Set("username", myClaims.UserName)
		c.Next()
	}
}

func main() {
	r := gin.Default()

	// 登陆接口 用户名密码必须穿root 123456
	r.POST("/login", func(c *gin.Context) {
		var data LoginData
		// 在这种情况下,将自动选择合适的绑定
		if c.ShouldBind(&data) == nil {
			fmt.Println(data.User, data.Password)
			if data.User == "root" && data.Password == "123456" {
				token, _ := GenerateToken(&data)
				c.JSON(200, gin.H{"token": token})
			} else {
				c.JSON(401, gin.H{"status": "unauthorized"})
			}
		}
	})

	// 测试token是否有效
	r.GET("/testToken", VerificationToken, func(c *gin.Context) {
		username, _ := c.Get("username")
		c.JSON(200, gin.H{"username": username})

	})

	r.Run(":8080")
}

// 生成token
func GenerateToken(loginData *LoginData) (string, error) {

	maxAge := 60 * 24
	c := MyClaims{
		UserName: loginData.User,
		StandardClaims: jwt.StandardClaims{
			ExpiresAt: time.Now().Add(time.Duration(maxAge) * time.Second).Unix(), // 过期时间
			NotBefore: time.Now().Unix(),                                          // 生效时间
			Issuer:    "本人",                                                       // 签发人
		},
	}
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, c)
	// 用私钥加密token
	tokenStr, err := token.SignedString([]byte(SECRETKEY))
	return tokenStr, err
}

// 解析token
func ParseToken(tokenString string) (*MyClaims, error) {
	token, err := jwt.ParseWithClaims(tokenString, &MyClaims{}, func(token *jwt.Token) (interface{}, error) {
		if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
			return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"])
		}
		return []byte(SECRETKEY), nil
	})
	if claims, ok := token.Claims.(*MyClaims); ok && token.Valid {
		return claims, nil
	} else {
		return nil, err
	}
}

到此这篇关于golang整合jwt的实现示例的文章就介绍到这了,更多相关golang整合jwt内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

您可能感兴趣的文章:
阅读全文