go-micro微服务JWT跨域认证问题

 更新时间:2023年01月16日 10:30:15   作者:qi66  
JWT 以 JSON 对象的形式安全传递信息。因为存在数字签名,因此所传递的信息是安全的,这篇文章主要介绍了go-micro微服务JWT跨域认证,需要的朋友可以参考下

一 JWT介绍

JWT 英文名是 Json Web Token ,是一种用于通信双方之间传递安全信息的简洁的、URL安全的表述性声明规范,经常用在跨域身份验证。

JWT 以 JSON 对象的形式安全传递信息。因为存在数字签名,因此所传递的信息是安全的。

一个JWT Token就像这样:

eyJhbGci0iJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoyODAx0DcyNzQ40DMyMzU4NSwiZ
XhwIjoxNTk0NTQwMjkxLCJpc3MiOiJibHV1YmVsbCJ9.1k_ZrAtYGCeZhK3iupHxP1kgjBJzQTVTtX0iZYFx9wU

它是由.分隔的三部分组成,这三部分依次是:

  • 头部(Header)
  • 负载(Payload)
  • 签名(Signature)

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

二 JWT优缺点

JWT拥有基于Token的会话管理方式所拥有的一切优势,不依赖Cookie,使得其可以防止CSRF攻
击,也能在禁用Cookie的浏览器环境中正常运行。

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

三 JWT使用

1. 导包和数据定义

package token

import (
   "account/config/redis"
   "errors"
   "fmt"
   "github.com/dgrijalva/jwt-go"
   "time"
)

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

const TokenExpireDuration = time.Hour * 2

var MySecret = []byte("Account")

2.生成JWT

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

3.解析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")
}

4.完整代码

package token

import (
   "account/config/redis"
   "errors"
   "fmt"
   "github.com/dgrijalva/jwt-go"
   "time"
)

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

const TokenExpireDuration = time.Hour * 2

var MySecret = []byte("Account")

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

// 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")
}

四 最后

  • 至此,go-micro微服务JWT跨域认证工作就正式完成。

  • 接下来就开始公用函数的代码编写了,希望大家关注博主和关注专栏,第一时间获取最新内容,每篇博客都干货满满。

到此这篇关于go-micro微服务JWT跨域认证的文章就介绍到这了,更多相关go-micro微服务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go安装和环境配置图文教程

    Go安装和环境配置图文教程

    本文主要介绍了Go安装和环境配置图文教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • 使用Go语言编写一个NTP服务器的流程步骤

    使用Go语言编写一个NTP服务器的流程步骤

    NTP服务器【Network Time Protocol(NTP)】是用来使计算机时间同步化的一种协议,为了确保封闭局域网内多个服务器的时间同步,我们计划部署一个网络时间同步服务器(NTP服务器),本文给大家介绍了使用Go语言编写一个NTP服务器的流程步骤,需要的朋友可以参考下
    2024-11-11
  • 使用Go语言实现读取本地文本文件内容

    使用Go语言实现读取本地文本文件内容

    这篇文章主要为大家详细介绍了如何使用Go语言实现读取本地文本文件内容功能,文中的示例代码简洁易懂,有需要的小伙伴可以参考一下
    2025-07-07
  • Go Web框架gin的入门教程

    Go Web框架gin的入门教程

    本篇文章主要介绍了Go Web框架gin的入门教程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • 从并发到并行解析Go语言中的sync.WaitGroup

    从并发到并行解析Go语言中的sync.WaitGroup

    Go 语言提供了许多工具和机制来实现并发编程,其中之一就是 sync.WaitGroup。本文就来深入讨论 sync.WaitGroup,探索其工作原理和在实际应用中的使用方法吧
    2023-05-05
  • 从入门到精通:Go语言XML数据解析指南

    从入门到精通:Go语言XML数据解析指南

    Go语言的XML包提供了强大的数据解析功能,让你轻松处理各种XML格式的数据,这个指南将带你深入了解如何使用Go语言的XML包,快速上手XML数据解析,准备好开启XML解析之旅了吗?Let's Go!
    2024-03-03
  • 使用Go语言生成二维码并在命令行中输出

    使用Go语言生成二维码并在命令行中输出

    二维码(QR code)是一种矩阵条码的标准,广泛应用于商业、移动支付和数据存储等领域,在开发过程中,我们可能需要在命令行中显示二维码,这可以帮助我们快速生成和分享二维码信息,本文将介绍如何使用Go语言生成二维码并在命令行中输出,需要的朋友可以参考下
    2023-11-11
  • 一文详解Go语言单元测试的原理与使用

    一文详解Go语言单元测试的原理与使用

    Go语言中自带有一个轻量级的测试框架testing和自带的go test命令来实现单元测试和性能测试。本文将通过示例详细聊聊Go语言单元测试的原理与使用,需要的可以参考一下
    2022-09-09
  • golang常用库之配置文件解析库-viper使用详解

    golang常用库之配置文件解析库-viper使用详解

    viper 配置管理解析库,是由大神 Steve Francia 开发,他在google领导着 golang 的产品开发,他也是 gohugo.io 的创始人之一,命令行解析库 cobra 开发者,这篇文章主要介绍了golang常用库之配置文件解析库-viper使用详解,需要的朋友可以参考下
    2020-10-10
  • Go语言实现简单的一个静态WEB服务器

    Go语言实现简单的一个静态WEB服务器

    这篇文章主要介绍了Go语言实现简单的一个静态WEB服务器,本文给出了实现代码和运行效果,学习Golang的练手作品,需要的朋友可以参考下
    2014-10-10

最新评论