快速开始
下载包
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内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论