首页 > 其他分享 >go使用JWT进行跨域认证最全教学

go使用JWT进行跨域认证最全教学

时间:2022-09-26 22:11:52浏览次数:56  
标签:return 跨域 JWT jwt token MyClaims Token go

JWT前言

JWT是JSON Web Token的缩写。JWT本身没有定义任何技术实现,它只是定义了一种基于Token的会话管理的规则,涵盖Token需要包含的标准内容和Token的生成过程。

JWT组成

JWT由.分割的三部分组成,这三部分依次是:

  • 头部(Header)
    作用:记录令牌类型、签名算法等 例如:{“alg":"HS256","type","JWT}
  • 负载(Payload)
    作用:携带一些用户信息 例如{"userId":"1","username":"mayikt"}
  • 签名(Signature)
    作用:防止Token被篡改、确保安全性 例如 计算出来的签名,一个字符串

头部和负载以json形式存在,这就是JWT中的JSON,三部分的内容都分别单独经过了Base64编码,以.拼接成一个JWT Token。

JWT在go中的使用

1.导包

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

2.定义结构体和一些基本信息

// MyClaims 自定义声明结构体并内嵌jwt.StandardClaims
// jwt包自带的jwt.StandardClaims只包含了官方字段
// 我们这里需要额外记录一个username字段,所以要自定义结构体
// 如果想要保存更多信息,都可以添加到这个结构体中
type MyClaims struct {
	ID    int    `json:"id"`
	Email string `json:"email"`
	jwt.StandardClaims
}

const TokenExpireDuration = time.Hour * 2

var MySecret = []byte("qi66")

3.生成JWT

// GenToken 生成JWT
func GenToken(ID int, Email string) (string, error) {
	// 创建一个我们自己的声明
	c := MyClaims{
		ID,
		Email, // 自定义字段
		jwt.StandardClaims{
			ExpiresAt: time.Now().Add(TokenExpireDuration).Unix(), // 过期时间
			Issuer:    "qi66",         // 签发人
		},
	}
	// 使用指定的签名方法创建签名对象
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, c)
	// 使用指定的secret签名并获得完整的编码后的字符串token
	return token.SignedString(MySecret)
}

4.解析JWT

// ParseToken 解析JWT
func ParseToken(tokenString string) (*MyClaims, error) {
	// 解析token
	var mc = new(MyClaims)
	token, err := jwt.ParseWithClaims(tokenString, mc, func(token *jwt.Token) (i interface{}, err error) {
		return MySecret, nil
	})
	if err != nil {
		return nil, err
	}
	if token.Valid { // 校验token
		return mc, nil
	}
	return nil, errors.New("invalid token")
}

使用JWT优缺点

JWT拥有基于Token的会话管理方式所拥有的一切优势,不依赖Cookie,使得其可以防止CSRF攻击,也能在禁用Cookie的浏览器环境中正常运行。
而JWT的最大优势是服务端不再需要存储Session,使得服务端认证鉴权业务可以方便扩展,避免存储Session所需要引入的Redis等组件,降低了系统架构复杂度。但这也是JWT最大的劣势,由于有效期存储在Token中,JWT Token-旦签发,就会在有效期内-直可用,无法在服务端废止,当用户进行登出操作,只能依赖客户端删除掉本地存储的JWT Token,如果需要禁用用户,单纯使用JWT就无法做到了。

标签:return,跨域,JWT,jwt,token,MyClaims,Token,go
From: https://www.cnblogs.com/qi66/p/16732709.html

相关文章

  • 【Django-rest-framework框架】第02回 APIView与序列化
    目录1.Http协议1.1简介1.2四大特性1.3请求数据格式1.4响应数据格式1.5http协议版本区别2.APIView基本使用2.1获取图书接口使用View+JsonResponsexie2.2使用APIVie......
  • .NET6 JWT(生成Token令牌)
    一、Net6环境下的.netcore项目里如何使用JWT。第一步,在Nuget引入JWT、Microsoft.AspNetCore.Authentication.JwtBearer这两个NuGet包 第二步,在appsettings.......
  • .net6 使用 JWT
    安装Nuget包Microsoft.AspNetCore.Authentication.JwtBearerProgram.cs里添加JWT//添加jwt验证:builder.Services.AddAuthentication(JwtBearerDefaults.Authent......
  • java service/web前端解决跨域( CORS policy: Response to preflight request doesn't
    1、什么是跨域?跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器施加的安全限制。所谓同源是指,域名,协议,端口均相同,只要有一个不同,就是跨域......
  • golang程序健壮性相关细节
    结构体定义1、请问下面输出是什么packagemainimport("fmt")funcmain(){l:=get()fmt.Printf("%p",l)fmt.Printf("%p",l.List)for......
  • go入门之搭建环境hello word
    1.安装go #检测版本goversiongoversiongo1.18.5windows/amd642.下载goland,登陆账号没有破解的3.创建项目 4.新建go文件  5.执行文件  6.目前就......
  • golang 中 取切片元素 与 切片再生成切片的区别
    funcmain(){//定义一个切片a:=[]byte{1,2,3}fmt.Printf("a的类型%T\n",a)//a的类型[]uint8fmt.Printf("a原来的值%v\n",a)//a原来的值[1......
  • MongoDB基本操作
     //返回指定字段:1表示返回,0表示不返回//默认返回_id,如果不想返回,加上_id:0//db.表名.find({条件},{返回字段:1})db.navigation_clicks.find({   "type":1},{......
  • 海外某音x-gorgon算法原理分析及算法源码公布
    算法源码见附件分享一个去年逆的一个海外版某音1474版本x-gorgon算法,这里简单介绍一下算法原理,首先malloc出来一个0x1A大小的空间,然后截取用户传入的byte数组中的参数,截......
  • Linux下安装mongodb
    1、下载mongodb.tgzhttps://www.mongodb.com/try/download/community2、将下载好的包传入到linux指定目录下3、解压tar-xvfmongodb-linux-x86_64-rhel80-6.0.1.tg......