用go封裝一下臨時token

来源:https://www.cnblogs.com/weloe/archive/2023/10/28/17794231.html
-Advertisement-
Play Games

用go封裝一下臨時token 本篇為用go設計開發一個自己的輕量級登錄庫/框架吧 的臨時token篇,會講講臨時token的實現,給庫/框架增加新的功能。 Github:https://github.com/weloe/token-go 臨時token也算是比較常見的業務,例如登錄驗證碼信息,邀請鏈 ...


用go封裝一下臨時token

本篇為用go設計開發一個自己的輕量級登錄庫/框架吧 的臨時token篇,會講講臨時token的實現,給庫/框架增加新的功能。

Github:https://github.com/weloe/token-go

臨時token也算是比較常見的業務,例如登錄驗證碼信息,邀請鏈接等等,都屬於臨時token的範疇。

在token-go中同樣使用Adapter組件進行了簡單的封裝。

封裝思路

對於一個登錄驗證碼,我們需要有創建,有效期,需要解析,需要能刪除的功能。

因此,我們需要創建臨時token,獲取臨時token有效期,解析臨時token,刪除臨時token這幾個方法。

而臨時token會跟業務信息做關聯,比如這個臨時token是用於驗證碼服務或是用於邀請服務他們是互相隔離的,因此在存儲的時候我們需要一個service參數做區分,我們存儲為k,v結構,存儲的key結構為: "token-go:" + "temp-token" + ":temp:" + service + ":" + token,存儲的value即為設定的對應的值。

最後決定出幾個api

	// Temp token api
	CreateTempToken(token string, service string, value string, timeout int64) (string, error)
	CreateTempTokenByStyle(style string, service string, value string, timeout int64) (string, error)
	GetTempTokenTimeout(service string, tempToken string) int64
	ParseTempToken(service string, tempToken string) string
	DeleteTempToken(service string, tempToken string) error

代碼實現

創建臨時token

這裡我們提供了兩個方法,一個用於根據style使用內置創建token的函數創建token,另一個用於直接由開發者生成token再傳入。創建token則是Adapter對信息進行存儲。

通過指定style創建

https://github.com/weloe/token-go/blob/90e576f01537c92b924670dee3e32b8d7f010585/enforcer_manager_api.go#L211

func (e *Enforcer) CreateTempTokenByStyle(style string, service string, value string, timeout int64) (string, error) {
	token, err := e.generateFunc.Exec(style)
	if err != nil {
		return "", err
	}
	err = e.setTempToken(service, token, value, timeout)
	if err != nil {
		return "", err
	}
	return token, nil
}

指定token創建。

https://github.com/weloe/token-go/blob/90e576f01537c92b924670dee3e32b8d7f010585/enforcer_manager_api.go#L223

func (e *Enforcer) CreateTempToken(token string, service string, value string, timeout int64) (string, error) {
	if token == "" {
		return "", fmt.Errorf("token must not be empty")
	}
	err := e.setTempToken(service, token, value, timeout)
	if err != nil {
		return "", err
	}
	return token, nil
}

獲取剩餘時間

https://github.com/weloe/token-go/blob/90e576f01537c92b924670dee3e32b8d7f010585/enforcer_manager_api.go#L234

同樣是使用Adapter組件去獲取剩餘時間

func (e *Enforcer) GetTempTokenTimeout(service string, tempToken string) int64 {
	if tempToken == "" {
		return constant.NotValueExpire
	}
	return e.getTimeoutByTempToken(service, tempToken)
}
func (e *Enforcer) getTimeoutByTempToken(service string, token string) int64 {
	return e.adapter.GetTimeout(e.spliceTempTokenKey(service, token))
}

解析臨時token

https://github.com/weloe/token-go/blob/90e576f01537c92b924670dee3e32b8d7f010585/enforcer_manager_api.go#L241

解析即是通過service,token去Adapter中獲取對應的信息。

func (e *Enforcer) ParseTempToken(service string, tempToken string) string {
	if tempToken == "" {
		return ""
	}
	return e.getByTempToken(service, tempToken)
}

刪除臨時token

https://github.com/weloe/token-go/blob/90e576f01537c92b924670dee3e32b8d7f010585/enforcer_manager_api.go#L248

刪除臨時token則是從Adapter組件中刪除對應的k,v數據

func (e *Enforcer) DeleteTempToken(service string, tempToken string) error {
	return e.deleteByTempToken(service, tempToken)
}

測試

func TestEnforcer_TempToken(t *testing.T) {
	enforcer, _ := NewTestEnforcer(t)
	service := "code"
	tempToken, err := enforcer.CreateTempToken("tempToken", service, "1234", -1)
	if err != nil {
		t.Fatalf("CreateTempToken() failed: %v", err)
	}
	if !reflect.DeepEqual(tempToken, "tempToken") {
		t.Fatalf("token error, want is %v", "1234")
	}
	timeout := enforcer.GetTempTokenTimeout(service, tempToken)
	if timeout != -1 {
		t.Errorf("GetTempTokenTimeout() failed, unexpected timeout: %v", timeout)
	}
	codeValue := enforcer.ParseTempToken("code", tempToken)
	if codeValue != "1234" {
		t.Errorf("ParseTempToken() failed, unexpected codeValue: %v", codeValue)
	}

	// delete
	if enforcer.DeleteTempToken(service, tempToken) != nil {
		t.Fatalf("DeleteTempToken() failed: %v", err)
	}
	tokenTimeout := enforcer.GetTempTokenTimeout(service, tempToken)
	if tokenTimeout != -2 {
		t.Errorf("GetTempTokenTimeout() failed, unexpected tokenTimeout: %v", tokenTimeout)
	}
	codeValue = enforcer.ParseTempToken(service, tempToken)
	if codeValue != "" {
		t.Errorf("ParseTempToken() failed, unexpected codeValue: %v", codeValue)
	}

	// create token
	tempToken, err = enforcer.CreateTempTokenByStyle("uuid", service, "1234", -1)
	if err != nil {
		t.Fatalf("CreateTempTokenByStyle() failed: %v", err)
	}
	// delete
	if enforcer.DeleteTempToken(service, tempToken) != nil {
		t.Fatalf("DeleteTempToken() failed: %v", err)
	}
}
--- PASS: TestEnforcer_TempToken (0.01s)
PASS

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天我們來看看Dart語言的一個有趣的特性——可調用對象。對象也可以像函數那樣被調用,這個特性是怎麼用的呢…… ...
  • 基礎知識 機器語言 機器語言是機器指令的集合 機器指令是一臺機器可以正確執行的命令 機器指令由一串二進位數表示 彙編語言 彙編語言的主體是彙編指令 彙編指令是機器指令便於記憶的書寫格式 彙編指令是機器指令的助記符 彙編語言的組成 彙編指令:機器碼的助記符,有對應的機器碼 偽指令::沒有對應的機器碼, ...
  • 可移動嵌入式設備是數據客戶端的一種表現形式。軟體的代碼編寫之後是運行在伺服器之上, 伺服器的數據為客戶端提供服務的模式為伺服器客戶端模式,server2client 架構。伺服器可以是大型的機器,也可以是小型機,主要看數據處理量和用戶量的大小。一臺電腦其實就是一臺簡單的伺服器,電腦的存在是使用中 ...
  • 一些研發工程師在Springboot註意點1. 正確設計代碼目錄結構雖然您有很大的自由度,但有一些基本規則值得遵循來設計您的源代碼結構。避免使用預設包。確保所有內容(包括入口點)都在命名良好的包中,這樣您就可以避免與組裝和組件掃描相關的意外情況;將 Application.java(應用程式的入口類 ...
  • 變數只在創建它的區域內可用。這被稱為作用域。 局部作用域 在函數內部創建的變數屬於該函數的局部作用域,並且只能在該函數內部使用。 示例:在函數內部創建的變數在該函數內部可用: def myfunc(): x = 300 print(x) myfunc() 函數內部的函數 如上面的示例所解釋的那樣,變 ...
  • 一.數組 數組的定義:相同類型的數據集合 go語言中數組的索引從0開始 沒有賦值的數值型數組,預設值為0 數組一旦被創建,它的大小就是不可改變的 (1)聲明數組與列印 var 變數名 [大小]變數類型 //數組的聲明 var nums [4]int //數組的賦值 nums[0] = 1 nums[ ...
  • 對於日常開發者來講很少會使用到本章節的內容,但是對框架作者等是必備知識,同時也是高頻的面試常見問題。 1.線程安全 線程安全是多線程或多進程編程中的一個概念,在擁有共用數據的多條線程並行執行的程式中,線程安全的代碼會通過同步機制保證各個線程都可以正常且正確的執行,不會出現數據污染等意外情況。 線程安 ...
  • 在寫代碼的時候,免不了要使用變數。但程式中的一個變數並不一定是在哪裡都可以被使用,根據情況不同,會有不同的“有效範圍”。 看這樣一段代碼: def func(x): print ('X in the beginning of func(x): ', x) x = 2 print ('X in the ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...