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

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

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就无法做到了。


相关文章
|
1月前
|
安全 Java Spring
Spring Security+jwt实现认证
Spring Security+jwt实现认证
|
1月前
|
安全 数据安全/隐私保护
Springboot+Spring security +jwt认证+动态授权
Springboot+Spring security +jwt认证+动态授权
123 0
|
19天前
|
消息中间件 Serverless Go
Serverless 应用引擎操作报错合集之通过自定义域名配置jwt认证,始终报错:"Code": "JWTTokenIsInvalid",是什么导致的
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
8天前
|
JSON 算法 Shell
怎么在在 go 中使用 jwt
JWT(JSON Web Tokens)由三个部分组成:Header、Payload和Signature。Header通常包含`alg`(算法)和`typ`(类型)字段,如`HS256`或`JWT`。Payload则包括官方标准字段如`iss`(签发人)、`exp`(过期时间)等,以及可自定义的数据,比如用户信息。Signature用于验证JWT未被篡改,通过HMAC算法(如HS256)或非对称加密(如RS256)确保安全性。完整JWT是这三部分经过编码和签名后的结果。
|
10天前
|
JSON 算法 Go
go语言后端开发学习(一)——JWT的介绍以及基于JWT实现登录验证
go语言后端开发学习(一)——JWT的介绍以及基于JWT实现登录验证
1天搞定SpringBoot+Vue全栈开发 (9)JWT跨域认证
1天搞定SpringBoot+Vue全栈开发 (9)JWT跨域认证
|
15天前
|
JSON 安全 Java
Spring Security 与 JWT、OAuth 2.0 整合详解:构建安全可靠的认证与授权机制
Spring Security 与 JWT、OAuth 2.0 整合详解:构建安全可靠的认证与授权机制
29 0
|
1月前
|
JSON SpringCloudAlibaba Cloud Native
SpringCloudAlibaba:4.3云原生网关higress的JWT 认证
SpringCloudAlibaba:4.3云原生网关higress的JWT 认证
36 1
|
1月前
|
运维 Serverless API
Serverless 应用引擎产品使用之阿里函数计算中要关掉http触发器的jwt认证才可以进行性能探测如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
1月前
|
JSON 安全 API
【专栏】四种REST API身份验证方法:基本认证、OAuth、JSON Web Token(JWT)和API密钥
【4月更文挑战第28天】本文探讨了四种REST API身份验证方法:基本认证、OAuth、JSON Web Token(JWT)和API密钥。基本认证简单但不安全;OAuth适用于授权第三方应用;JWT提供安全的身份验证信息传递;API密钥适合内部使用。选择方法时需平衡安全性、用户体验和开发复杂性。