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

簡單高效!Go語言封裝二級認(rèn)證功能實(shí)現(xiàn)

 更新時間:2023年10月03日 10:07:27   作者:秋玻  
本文將介紹如何使用Go語言封裝二級認(rèn)證功能,實(shí)現(xiàn)簡單高效的用戶認(rèn)證流程,二級認(rèn)證是一種安全措施,要求用戶在登錄后進(jìn)行額外的身份驗(yàn)證,以提高賬戶安全性,

本篇為二級認(rèn)證業(yè)務(wù)篇,會講講二級認(rèn)證業(yè)務(wù)的實(shí)現(xiàn),給庫/框架增加新的功能。

源碼:https://github.com/weloe/token-go

在一個系統(tǒng)中,為了保證賬號安全性,我們除了登錄之外可能還會進(jìn)行二次校驗(yàn),例如游戲中的交易密碼認(rèn)證,博客園登錄的兩步驗(yàn)證等等。因此,我打算為token-go封裝下二級認(rèn)證的功能。

實(shí)現(xiàn)思路

對于二級認(rèn)證我們的認(rèn)證對象是token也就是一個登錄對象,為了兼容各種業(yè)務(wù)還要加上service業(yè)務(wù),最后就是這個認(rèn)證生效的時間time,畢竟總不能一次認(rèn)證過了以后就再也不用認(rèn)證了,那這個二級認(rèn)證的功能也就沒有意義了。

在業(yè)務(wù)上我們往往需要的四個方法,執(zhí)行認(rèn)證,判斷是否認(rèn)證,查看認(rèn)證生效的剩余時間,取消認(rèn)證(讓認(rèn)證失效)。

從代碼實(shí)現(xiàn)上看

認(rèn)證需要存儲token-service信息

判斷是否認(rèn)證有效(是否在認(rèn)證時間內(nèi))就是去判斷這個token-service信息是否存在了

查看認(rèn)證生效的剩余時間就是獲取一下token-service的剩余存儲時間

取消認(rèn)證(讓認(rèn)證失效)也就是手動去刪除這個token-service信息了,一般來說在退出登錄的時候需要取消認(rèn)證信息。

而存儲刪除等持久化操作則使用Adapter

https://github.com/weloe/token-go/blob/9d1a8be2c16559d46460c82b33995b789e6e31c4/enforcer_interface.go#L58

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)證生效的剩余時間

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
}

測試

https://github.com/weloe/token-go/blob/9d1a8be2c16559d46460c82b33995b789e6e31c4/enforcer_test.go#L478

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)文章

最新評論

安仁县| 花垣县| 上高县| 鹤峰县| 定结县| 芷江| 奈曼旗| 丰城市| 尤溪县| 虞城县| 高淳县| 双江| 错那县| 永丰县| 乌拉特后旗| 金堂县| 吉水县| 威宁| 遂宁市| 临朐县| 温州市| 蓝田县| 韶关市| 满洲里市| 五家渠市| 宣化县| 井研县| 武乡县| 红河县| 吴桥县| 利津县| 澄江县| 武强县| 缙云县| 大埔县| 泊头市| 寻乌县| 和静县| 衡水市| 海安县| 宁津县|