当前位置: 代码网 > it编程>前端脚本>Golang > golang整合jwt的实现示例

golang整合jwt的实现示例

2024年09月08日 Golang 我要评论
快速开始下载包go get github.com/dgrijalva/jwt-go直接上代码package mainimport ("fmt""time""github.com/dgrijalva/j

快速开始

下载包

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内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网! 

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com