欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

go-micro微服務JWT跨域認證問題

 更新時間:2023年01月16日 10:30:15   作者:qi66  
JWT 以 JSON 對象的形式安全傳遞信息。因為存在數字簽名,因此所傳遞的信息是安全的,這篇文章主要介紹了go-micro微服務JWT跨域認證,需要的朋友可以參考下

一 JWT介紹

JWT 英文名是 Json Web Token ,是一種用于通信雙方之間傳遞安全信息的簡潔的、URL安全的表述性聲明規(guī)范,經常用在跨域身份驗證。

JWT 以 JSON 對象的形式安全傳遞信息。因為存在數字簽名,因此所傳遞的信息是安全的。

一個JWT Token就像這樣:

eyJhbGci0iJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoyODAx0DcyNzQ40DMyMzU4NSwiZ
XhwIjoxNTk0NTQwMjkxLCJpc3MiOiJibHV1YmVsbCJ9.1k_ZrAtYGCeZhK3iupHxP1kgjBJzQTVTtX0iZYFx9wU

它是由.分隔的三部分組成,這三部分依次是:

  • 頭部(Header)
  • 負載(Payload)
  • 簽名(Signature)

頭部和負載以jSON形式存在,這就是JWT中的JSON,三部分的內容都分別單獨經過了Base64編
碼,以.拼接成一個JWT Token。

二 JWT優(yōu)缺點

JWT擁有基于Token的會話管理方式所擁有的一切優(yōu)勢,不依賴Cookie,使得其可以防止CSRF攻
擊,也能在禁用Cookie的瀏覽器環(huán)境中正常運行。

而JWT的最大優(yōu)勢是服務端不再需要存儲Session,使得服務端認證鑒權業(yè)務可以方便擴展,避免存儲
Session所需要引入的Redis等組件,降低了系統架構復雜度。但這也是JWT最大的劣勢,由于有效期
存儲在Token中,JWT Token一旦簽發(fā),就會在有效期內一直可用,無法在服務端廢止,當用戶進行登
出操作,只能依賴客戶端刪除掉本地存儲的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) {
   // 創(chuàng)建一個我們自己的聲明
   c := MyClaims{
      UserName, // 自定義字段
      jwt.StandardClaims{
         ExpiresAt: time.Now().Add(TokenExpireDuration).Unix(), // 過期時間
         Issuer:    "Account",                                  // 簽發(fā)人
      },
   }
   // 使用指定的簽名方法創(chuàng)建簽名對象
   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) {
   // 創(chuàng)建一個我們自己的聲明
   c := MyClaims{
      UserName, // 自定義字段
      jwt.StandardClaims{
         ExpiresAt: time.Now().Add(TokenExpireDuration).Unix(), // 過期時間
         Issuer:    "Account",                                  // 簽發(fā)人
      },
   }
   // 使用指定的簽名方法創(chuàng)建簽名對象
   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微服務內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Go語言基礎go doc命令用法及示例詳解

    Go語言基礎go doc命令用法及示例詳解

    這篇文章主要為大家介紹了Go語言基礎go doc命令的用法及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進步
    2021-11-11
  • Go os/exec使用方式實踐

    Go os/exec使用方式實踐

    這篇文章主要介紹了Go os/exec使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-07-07
  • golang 實現Location跳轉方式

    golang 實現Location跳轉方式

    這篇文章主要介紹了golang 實現Location跳轉方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • golang讀取yaml文件的示例代碼

    golang讀取yaml文件的示例代碼

    本文主要介紹了golang讀取yaml文件的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-09-09
  • golang中兩個協程交替打印數字和字母的實現

    golang中兩個協程交替打印數字和字母的實現

    這篇文章給大家介紹了golang中兩個協程交替打印數字和字母的實現,文中通過代碼示例講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-01-01
  • go之值類型與引用類型使用及說明

    go之值類型與引用類型使用及說明

    這篇文章主要介紹了go之值類型與引用類型使用及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-07-07
  • 使用Golang實現對網絡數據包的捕獲與分析

    使用Golang實現對網絡數據包的捕獲與分析

    在網絡通信中,網絡數據包是信息傳遞的基本單位,抓包是一種監(jiān)控和分析網絡流量的方法,用于獲取網絡數據包并對其進行分析,本文將介紹如何使用Golang實現抓包功能,包括網絡數據包捕獲和數據包分析,需要的朋友可以參考下
    2023-11-11
  • MacOS下本地golang環(huán)境搭建詳細教程

    MacOS下本地golang環(huán)境搭建詳細教程

    這篇文章主要介紹了MacOS下本地golang環(huán)境搭建詳細教程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • Go并發(fā)編程之goroutine使用正確方法

    Go并發(fā)編程之goroutine使用正確方法

    并發(fā)編程有一種常見方式就是許多工作子協程都是獨立的,互不干擾,但他們又是“同一時間”處理。本文重大給大家介紹Go并發(fā)編程goroutine使用方法,一起看看吧
    2021-09-09
  • golang 中獲取字符串個數的方法

    golang 中獲取字符串個數的方法

    這篇文章主要介紹了golang 中獲取字符串個數 ,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08

最新評論