首页 > 其他分享 >go-使用jwt生成令牌

go-使用jwt生成令牌

时间:2023-03-16 13:14:30浏览次数:36  
标签:令牌 V1Controller jwt tokenStr token api go gin

/*
jwt - 生成token测试
1.首先需要定义一个结构体,这个结构体选哟继承jwt.StandardClain,s 结构体
2.定义key 和过期时间
3.实例化存储token的结构体
4.使用指定的签名方法创建签名对象
5.使用指定的 secret 签名 并获得完整的编码后的字符串 token
*/

// 1.首先需要定义一个结构体,这个结构体选哟继承jwt.StandardClain,s 结构体
type MyClaims struct {
Uid int //自定义的属性 用于不同接口传值
jwt.StandardClaims
}

// 2.定义key 和过期时间
var jwtKey = []byte("huazai.com")
var expireTime = time.Now().Add(24 * time.Hour).Unix()

func (con V1Controller) Login(c *gin.Context) {
// 3.实例化存储token的结构体
myClaimsObj := MyClaims{
23,
jwt.StandardClaims{
ExpiresAt: expireTime,
Issuer: "huazai",
},
}
// 4.使用指定的签名方法创建签名对象
tokenObj := jwt.NewWithClaims(jwt.SigningMethodHS256, myClaimsObj)
// 5.使用指定的 secret 签名 并获得完整的编码后的字符串 token
tokenStr, err := tokenObj.SignedString(jwtKey)

fmt.Println(tokenStr)

if err != nil {
c.JSON(http.StatusOK, gin.H{
"message": "生成token失败重试",
"success": false,
})
return
}

c.JSON(http.StatusOK, gin.H{
"message": "获取token成功",
"token": tokenStr,
"success": true,
})
}

// 测试从前端发起的请求头中拿到token
func (con V1Controller) AddressList(c *gin.Context) {
//获取token
tokenData := c.Request.Header.Get("Authorization")
fmt.Println("---------")
fmt.Println(tokenData)
if len(tokenData) > 0 {
fmt.Println("---------")
tokenStr := strings.Split(tokenData, " ")[1]

fmt.Println(tokenStr)
token, myClaims, err := ParseToken(tokenStr)

if err != nil || !token.Valid {
c.JSON(http.StatusOK, gin.H{
"message": "token传入错误",
"success": false,
})
} else {
c.JSON(http.StatusOK, gin.H{
"message": "验证token成功",
"Uid": myClaims.Uid,
"success": true,
})

}
}
}

type Address struct {
Username string `form:"username" json:"username"`
Address string `form:"address" json:"address"`
Tel string `form:"tel" json:"tel"`
}

//测试从post请求中拿到数据以及token验证
func (con V1Controller) Address(c *gin.Context) {
//获取数据 post

var address Address
b, _ := c.GetRawData()
json.Unmarshal(b, &address)
fmt.Println(address)

//获取token
tokenData := c.Request.Header.Get("Authorization")
if len(tokenData) > 0 {
tokenStr := strings.Split(tokenData, " ")[1]

token, myClaims, err := ParseToken(tokenStr)

if err != nil || !token.Valid {
c.JSON(http.StatusOK, gin.H{
"message": "传入token错误",
"success": false,
})
return
} else {
c.JSON(http.StatusOK, gin.H{
"message": "验证token成功",
"Uid": myClaims.Uid,
"success": true,
})
}
}

}

// 验证token是否合法
func ParseToken(tokenStr string) (*jwt.Token, *MyClaims, error) {
myClaims := &MyClaims{}
token, err := jwt.ParseWithClaims(tokenStr, myClaims, func(token *jwt.Token) (i interface{}, err error) {
return jwtKey, nil
})
return token, myClaims, err
}


路由
func ApiRoutersInit(r *gin.Engine) {
apiRouters := r.Group("/api/v1")
{
apiRouters.GET("/navList", api.V1Controller{}.Navlist)
apiRouters.POST("/doLogin", api.V1Controller{}.DoLogin)
apiRouters.PUT("/editArticle", api.V1Controller{}.EditArticle)
apiRouters.DELETE("/deleteNav", api.V1Controller{}.DeleteNav)

//jwt测试
apiRouters.GET("/login", api.V1Controller{}.Login)
apiRouters.GET("/addressList", api.V1Controller{}.AddressList)
apiRouters.POST("/addAddress", api.V1Controller{}.Address)
}
}

前端请求接口
<template>   <div class="about">     <h2>JWT demo</h2>
    <br />     <button @click="getAddress">获取收货地址</button>
    <br />     <br />     <br />     <button @click="addAddress">增加收货地址</button>   </div> </template>
<script> export default {   name: "home",   data() {     return {       msg: "this is about",     };   },   methods: {     getAddress() {       var token = localStorage.getItem("token");       this.$axios         .get("http://localhost:8080/api/v1/addressList", {           headers: {             Authorization: "Bearer " + token,           },         })         .then(function (response) {           console.log(response);         })         .catch(function (error) {           console.log(error);         });     },     addAddress() {       var token = localStorage.getItem("token");       this.$axios         .post(           "http://localhost:8080/api/v1/addAddress",           { username: "张三" },           {             headers: {               Authorization: "Bearer " + token,             },           }         )         .then(function (response) {           console.log(response);         })         .catch(function (error) {           console.log(error);         });     },   }, }; </script>    

标签:令牌,V1Controller,jwt,tokenStr,token,api,go,gin
From: https://www.cnblogs.com/lunar-huazai/p/17222151.html

相关文章

  • Expectation-Maximization algorithm
    1.IntroductionTheExpectation-Maximization(EM)algorithmisawidelyusedstatisticalalgorithmformaximumlikelihoodestimationincaseswherethereismi......
  • go微服务开发:go-zero入门教程
    以下内容,参考了go-zero官方文档,是对官方文档的进阶指南章节的梳理汇总。go-zero的进阶指南,请参考https://go-zero.dev/cn/docs/advance/business-dev第一步:下载并解压go......
  • 容器化docker部署nginx代理的go-web应用
    通常我们的web应用程序部署的时候不会直接暴露,通过nginx反向代理,一是隐藏真实后端,二是通过nginx的epoll网络IO多路复用,获取高性能的网络访问。今天我们分享个通过nginx代......
  • Golang-微服务-紧急升级-缓存
    1.背景API服务器timewait一直下不去尝试阿里云优化方案,修改内核配置,也不管用前端表现为:页面访问卡顿页面丢失(接口504)Postmanstart_trasfer参数忽高忽......
  • android的google三方登录一直返回10
    标题:com.Google.android.gms.common.api.apiException:10:为何一直报错,这个问题的来源是可参考这里的状态码:googleStatusCodes配置其实都很简单,可参考:googleAndroid登录......
  • Hello, YOU -- 通过简单的 hello_test.go 程序理解并学会编写测试
    Hello,YOU书接上文......
  • ABP 结合 MongoDB 集成依赖注入
    1.我们再ABP项目添加一个.NETCore类库 类库名自定定义,我这里定义为 TexHong_EMWX.MongoDb添加NuGet包。ABPmongocsharpdriver  添加 AbpMongoDbConfigurati......
  • python+playwright 学习-33.launch_persistent_context 启动本地 Google Chrome 并加
    前言playwright启动GoogleChrome浏览器的时候默认用的是无痕模式,不加载本地的数据,这对于测试人员运行一个干净的浏览器是没问题的。大家在学selenium的时候,知道selen......
  • Django-4
    Django-41.url的路由系统1、url(r'^index/',views.index),url(r'^home/',views.Home.as_view()),2、url(r'^detail-(\d+).html',views.detail),3、url(r'^......
  • go库存扣减的几种方法
    用编码工具,建议用最新版Goland,因为我有正式版激活码https://www.mano100.cn/thread-1942-1-1.html 现在就开始你的Go语言学习之旅吧!人生苦短,let’sGo.Go库存扣减......