最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

go-micro微服務(wù)JWT跨域認(rèn)證問(wèn)題

 更新時(shí)間:2023年01月16日 10:30:15   作者:qi66  
JWT 以 JSON 對(duì)象的形式安全傳遞信息。因?yàn)榇嬖跀?shù)字簽名,因此所傳遞的信息是安全的,這篇文章主要介紹了go-micro微服務(wù)JWT跨域認(rèn)證,需要的朋友可以參考下

一 JWT介紹

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

JWT 以 JSON 對(duì)象的形式安全傳遞信息。因?yàn)榇嬖跀?shù)字簽名,因此所傳遞的信息是安全的。

一個(gè)JWT Token就像這樣:

eyJhbGci0iJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoyODAx0DcyNzQ40DMyMzU4NSwiZ
XhwIjoxNTk0NTQwMjkxLCJpc3MiOiJibHV1YmVsbCJ9.1k_ZrAtYGCeZhK3iupHxP1kgjBJzQTVTtX0iZYFx9wU

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

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

頭部和負(fù)載以jSON形式存在,這就是JWT中的JSON,三部分的內(nèi)容都分別單獨(dú)經(jīng)過(guò)了Base64編
碼,以.拼接成一個(gè)JWT Token。

二 JWT優(yōu)缺點(diǎn)

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

而JWT的最大優(yōu)勢(shì)是服務(wù)端不再需要存儲(chǔ)Session,使得服務(wù)端認(rèn)證鑒權(quán)業(yè)務(wù)可以方便擴(kuò)展,避免存儲(chǔ)
Session所需要引入的Redis等組件,降低了系統(tǒng)架構(gòu)復(fù)雜度。但這也是JWT最大的劣勢(shì),由于有效期
存儲(chǔ)在Token中,JWT Token一旦簽發(fā),就會(huì)在有效期內(nèi)一直可用,無(wú)法在服務(wù)端廢止,當(dāng)用戶進(jìn)行登
出操作,只能依賴客戶端刪除掉本地存儲(chǔ)的JWT Token,如果需要禁用用戶,單純使用JWT就無(wú)法做到。

三 JWT使用

1. 導(dǎo)包和數(shù)據(jù)定義

package token

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

// MyClaims 自定義聲明結(jié)構(gòu)體并內(nèi)嵌jwt.StandardClaims
// jwt包自帶的jwt.StandardClaims只包含了官方字段
// 我們這里需要額外記錄一個(gè)username字段,所以要自定義結(jié)構(gòu)體
// 如果想要保存更多信息,都可以添加到這個(gè)結(jié)構(gòu)體中
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)建一個(gè)我們自己的聲明
   c := MyClaims{
      UserName, // 自定義字段
      jwt.StandardClaims{
         ExpiresAt: time.Now().Add(TokenExpireDuration).Unix(), // 過(guò)期時(shí)間
         Issuer:    "Account",                                  // 簽發(fā)人
      },
   }
   // 使用指定的簽名方法創(chuàng)建簽名對(duì)象
   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 { // 校驗(yàn)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 自定義聲明結(jié)構(gòu)體并內(nèi)嵌jwt.StandardClaims
// jwt包自帶的jwt.StandardClaims只包含了官方字段
// 我們這里需要額外記錄一個(gè)username字段,所以要自定義結(jié)構(gòu)體
// 如果想要保存更多信息,都可以添加到這個(gè)結(jié)構(gòu)體中
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)建一個(gè)我們自己的聲明
   c := MyClaims{
      UserName, // 自定義字段
      jwt.StandardClaims{
         ExpiresAt: time.Now().Add(TokenExpireDuration).Unix(), // 過(guò)期時(shí)間
         Issuer:    "Account",                                  // 簽發(fā)人
      },
   }
   // 使用指定的簽名方法創(chuàng)建簽名對(duì)象
   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 { // 校驗(yàn)token
      return mc, nil
   }
   return nil, errors.New("invalid token")
}

四 最后

  • 至此,go-micro微服務(wù)JWT跨域認(rèn)證工作就正式完成。

  • 接下來(lái)就開(kāi)始公用函數(shù)的代碼編寫了,希望大家關(guān)注博主和關(guān)注專欄,第一時(shí)間獲取最新內(nèi)容,每篇博客都干貨滿滿。

到此這篇關(guān)于go-micro微服務(wù)JWT跨域認(rèn)證的文章就介紹到這了,更多相關(guān)go-micro微服務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go安裝和環(huán)境配置圖文教程

    Go安裝和環(huán)境配置圖文教程

    本文主要介紹了Go安裝和環(huán)境配置圖文教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • 使用Go語(yǔ)言編寫一個(gè)NTP服務(wù)器的流程步驟

    使用Go語(yǔ)言編寫一個(gè)NTP服務(wù)器的流程步驟

    NTP服務(wù)器【Network?Time?Protocol(NTP)】是用來(lái)使計(jì)算機(jī)時(shí)間同步化的一種協(xié)議,為了確保封閉局域網(wǎng)內(nèi)多個(gè)服務(wù)器的時(shí)間同步,我們計(jì)劃部署一個(gè)網(wǎng)絡(luò)時(shí)間同步服務(wù)器(NTP服務(wù)器),本文給大家介紹了使用Go語(yǔ)言編寫一個(gè)NTP服務(wù)器的流程步驟,需要的朋友可以參考下
    2024-11-11
  • 使用Go語(yǔ)言實(shí)現(xiàn)讀取本地文本文件內(nèi)容

    使用Go語(yǔ)言實(shí)現(xiàn)讀取本地文本文件內(nèi)容

    這篇文章主要為大家詳細(xì)介紹了如何使用Go語(yǔ)言實(shí)現(xiàn)讀取本地文本文件內(nèi)容功能,文中的示例代碼簡(jiǎn)潔易懂,有需要的小伙伴可以參考一下
    2025-07-07
  • Go Web框架gin的入門教程

    Go Web框架gin的入門教程

    本篇文章主要介紹了Go Web框架gin的入門教程,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • 從并發(fā)到并行解析Go語(yǔ)言中的sync.WaitGroup

    從并發(fā)到并行解析Go語(yǔ)言中的sync.WaitGroup

    Go?語(yǔ)言提供了許多工具和機(jī)制來(lái)實(shí)現(xiàn)并發(fā)編程,其中之一就是?sync.WaitGroup。本文就來(lái)深入討論?sync.WaitGroup,探索其工作原理和在實(shí)際應(yīng)用中的使用方法吧
    2023-05-05
  • 從入門到精通:Go語(yǔ)言XML數(shù)據(jù)解析指南

    從入門到精通:Go語(yǔ)言XML數(shù)據(jù)解析指南

    Go語(yǔ)言的XML包提供了強(qiáng)大的數(shù)據(jù)解析功能,讓你輕松處理各種XML格式的數(shù)據(jù),這個(gè)指南將帶你深入了解如何使用Go語(yǔ)言的XML包,快速上手XML數(shù)據(jù)解析,準(zhǔn)備好開(kāi)啟XML解析之旅了嗎?Let's?Go!
    2024-03-03
  • 使用Go語(yǔ)言生成二維碼并在命令行中輸出

    使用Go語(yǔ)言生成二維碼并在命令行中輸出

    二維碼(QR code)是一種矩陣條碼的標(biāo)準(zhǔn),廣泛應(yīng)用于商業(yè)、移動(dòng)支付和數(shù)據(jù)存儲(chǔ)等領(lǐng)域,在開(kāi)發(fā)過(guò)程中,我們可能需要在命令行中顯示二維碼,這可以幫助我們快速生成和分享二維碼信息,本文將介紹如何使用Go語(yǔ)言生成二維碼并在命令行中輸出,需要的朋友可以參考下
    2023-11-11
  • 一文詳解Go語(yǔ)言單元測(cè)試的原理與使用

    一文詳解Go語(yǔ)言單元測(cè)試的原理與使用

    Go語(yǔ)言中自帶有一個(gè)輕量級(jí)的測(cè)試框架testing和自帶的go?test命令來(lái)實(shí)現(xiàn)單元測(cè)試和性能測(cè)試。本文將通過(guò)示例詳細(xì)聊聊Go語(yǔ)言單元測(cè)試的原理與使用,需要的可以參考一下
    2022-09-09
  • golang常用庫(kù)之配置文件解析庫(kù)-viper使用詳解

    golang常用庫(kù)之配置文件解析庫(kù)-viper使用詳解

    viper 配置管理解析庫(kù),是由大神 Steve Francia 開(kāi)發(fā),他在google領(lǐng)導(dǎo)著 golang 的產(chǎn)品開(kāi)發(fā),他也是 gohugo.io 的創(chuàng)始人之一,命令行解析庫(kù) cobra 開(kāi)發(fā)者,這篇文章主要介紹了golang常用庫(kù)之配置文件解析庫(kù)-viper使用詳解,需要的朋友可以參考下
    2020-10-10
  • Go語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的一個(gè)靜態(tài)WEB服務(wù)器

    Go語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的一個(gè)靜態(tài)WEB服務(wù)器

    這篇文章主要介紹了Go語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的一個(gè)靜態(tài)WEB服務(wù)器,本文給出了實(shí)現(xiàn)代碼和運(yùn)行效果,學(xué)習(xí)Golang的練手作品,需要的朋友可以參考下
    2014-10-10

最新評(píng)論

烟台市| 弥渡县| 濮阳市| 水城县| 汉寿县| 伊吾县| 陇川县| 手游| 宜章县| 紫云| 中牟县| 正镶白旗| 望城县| 巴林左旗| 施甸县| 青龙| 高阳县| 闻喜县| 娄烦县| 罗江县| 洛浦县| 通州区| 读书| 长春市| 凌海市| 颍上县| 新沂市| 绥芬河市| 慈溪市| 农安县| 襄汾县| 教育| 格尔木市| 巴青县| 娄底市| 永城市| 东港市| 鄂温| 宣恩县| 罗山县| 庄河市|