簡單高效!Go語言封裝二級認(rèn)證功能實(shí)現(xiàn)
本篇為二級認(rèn)證業(yè)務(wù)篇,會講講二級認(rèn)證業(yè)務(wù)的實(shí)現(xiàn),給庫/框架增加新的功能。
源碼:https://github.com/weloe/token-go
在一個(gè)系統(tǒng)中,為了保證賬號安全性,我們除了登錄之外可能還會進(jìn)行二次校驗(yàn),例如游戲中的交易密碼認(rèn)證,博客園登錄的兩步驗(yàn)證等等。因此,我打算為token-go封裝下二級認(rèn)證的功能。
實(shí)現(xiàn)思路
對于二級認(rèn)證我們的認(rèn)證對象是token也就是一個(gè)登錄對象,為了兼容各種業(yè)務(wù)還要加上service業(yè)務(wù),最后就是這個(gè)認(rèn)證生效的時(shí)間time,畢竟總不能一次認(rèn)證過了以后就再也不用認(rèn)證了,那這個(gè)二級認(rèn)證的功能也就沒有意義了。
在業(yè)務(wù)上我們往往需要的四個(gè)方法,執(zhí)行認(rèn)證,判斷是否認(rèn)證,查看認(rèn)證生效的剩余時(shí)間,取消認(rèn)證(讓認(rèn)證失效)。
從代碼實(shí)現(xiàn)上看
認(rèn)證需要存儲token-service信息
判斷是否認(rèn)證有效(是否在認(rèn)證時(shí)間內(nèi))就是去判斷這個(gè)token-service信息是否存在了
查看認(rèn)證生效的剩余時(shí)間就是獲取一下token-service的剩余存儲時(shí)間
取消認(rèn)證(讓認(rèn)證失效)也就是手動去刪除這個(gè)token-service信息了,一般來說在退出登錄的時(shí)候需要取消認(rèn)證信息。
而存儲刪除等持久化操作則使用Adapter
OpenSafe(token string, service string, time int64) error IsSafe(token string, service string) bool GetSafeTime(token string, service string) int64 CloseSafe(token string, service string) error
代碼實(shí)現(xiàn)
有了思路后代碼實(shí)現(xiàn)其實(shí)就很簡單了,無非就是存儲信息,判斷信息是否存在和刪除信息了。
執(zhí)行認(rèn)證
https://github.com/weloe/token-go/blob/9d1a8be2c16559d46460c82b33995b789e6e31c4/enforcer.go#L646
首先校驗(yàn)參數(shù),在執(zhí)行認(rèn)證前需要判斷一下是否登錄,不然怎么說是二級認(rèn)證?存儲token和service信息,調(diào)用logger,最后調(diào)用watcher提供擴(kuò)展點(diǎn)。
func (e *Enforcer) OpenSafe(token string, service string, time int64) error { if time == 0 { return nil } // 判斷是否登錄 err := e.CheckLoginByToken(token) if err != nil { return err } err = e.adapter.SetStr(e.spliceSecSafeKey(token, service), constant.DefaultSecondAuthValue, time) if err != nil { return err } if e.watcher != nil { e.watcher.OpenSafe(e.loginType, token, service, time) } return nil }
判斷是否認(rèn)證
https://github.com/weloe/token-go/blob/ac8674dc3ebbd4bcb213328b43f4c11678191919/enforcer.go#L665
判斷是否認(rèn)證即是判斷token-service信息是否存在。
func (e *Enforcer) IsSafe(token string, service string) bool { if token == "" { return false } str := e.adapter.GetStr(e.spliceSecSafeKey(token, service)) return str != "" }
查看認(rèn)證生效的剩余時(shí)間
https://github.com/weloe/token-go/blob/ac8674dc3ebbd4bcb213328b43f4c11678191919/enforcer.go#L673
func (e *Enforcer) GetSafeTime(token string, service string) int64 { if token == "" { return 0 } timeout := e.adapter.GetTimeout(e.spliceSecSafeKey(token, service)) return timeout }
取消認(rèn)證
https://github.com/weloe/token-go/blob/ac8674dc3ebbd4bcb213328b43f4c11678191919/enforcer.go#L681
取消就是使用adapter刪除token-service的信息
func (e *Enforcer) CloseSafe(token string, service string) error { if token == "" { return nil } err := e.adapter.DeleteStr(e.spliceSecSafeKey(token, service)) if err != nil { return err } if e.watcher != nil { e.watcher.CloseSafe(e.loginType, token, service) } return nil }
測試
func TestEnforcer_SecSafe(t *testing.T) { err, enforcer, _ := NewTestEnforcer(t) if err != nil { t.Fatalf("NewTestEnforcer() failed: %v", err) } tokenValue, err := enforcer.LoginById("1") if err != nil { t.Fatalf("LoginById() failed: %v", err) } service := "default_service" err = enforcer.OpenSafe(tokenValue, service, 600000) if err != nil { t.Fatalf("OpenSafe() failed: %v", err) } isSafe := enforcer.IsSafe(tokenValue, service) if !isSafe { t.Fatalf("IsSafe() failed, unexpected return value: %v", isSafe) } time := enforcer.GetSafeTime(tokenValue, service) t.Logf("safe time is %v", time) err = enforcer.CloseSafe(tokenValue, service) if err != nil { t.Fatalf("CloseSafe() failed: %v", err) } time = enforcer.GetSafeTime(tokenValue, service) if time != constant.NotValueExpire { t.Fatalf("error safe time: %v", time) } isSafe = enforcer.IsSafe(tokenValue, service) if isSafe { t.Fatalf("IsSafe() failed, unexpected return value: %v", isSafe) } }
=== RUN TestEnforcer_SecSafe 2023/10/02 20:56:00 timer period = 30, timer start enforcer_test.go:497: safe time is 600000 --- PASS: TestEnforcer_SecSafe (0.01s) PASS
通過使用Go語言封裝二級認(rèn)證功能,我們可以實(shí)現(xiàn)簡單高效的用戶認(rèn)證流程。這不僅可以提高賬戶的安全性,還可以簡化我們的代碼,并提高開發(fā)效率。
到此這篇關(guān)于簡單高效!Go語言封裝二級認(rèn)證功能實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)用go 封裝二級認(rèn)證功能內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang開啟mod后import報(bào)紅的簡單解決方案
這篇文章主要給大家介紹了關(guān)于golang開啟mod后import報(bào)紅的簡單解決方案,文中通過圖文將解決的辦法介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-01-01使用golang生成prometheus格式數(shù)據(jù)
Prometheus是一個(gè)開源的監(jiān)控系統(tǒng),擁有許多Advanced?Feature,本文將介紹Primetheus?client的使用,并基于golang生成prometheus格式數(shù)據(jù),希望對大家有所幫助2025-02-02go?分布式鎖簡單實(shí)現(xiàn)實(shí)例詳解
這篇文章主要為大家介紹了go?分布式鎖簡單實(shí)現(xiàn)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09