首页 > 其他分享 >用go封装一下二级认证功能

用go封装一下二级认证功能

时间:2023-10-02 21:57:43浏览次数:30  
标签:封装 service err 认证 token go string

用go封装一下二级认证

本篇为用go设计开发一个自己的轻量级登录库/框架吧 - 秋玻 - 博客园 (cnblogs.com)的二级认证业务篇,会讲讲二级认证业务的实现,给库/框架增加新的功能。

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

在一个系统中,为了保证账号安全性,我们除了登录之外可能还会进行二次校验,例如游戏中的交易密码认证,博客园登录的两步验证等等。因此,我打算为token-go封装下二级认证的功能。

实现思路

对于二级认证我们的认证对象是token也就是一个登录对象,为了兼容各种业务还要加上service业务,最后就是这个认证生效的时间time,毕竟总不能一次认证过了以后就再也不用认证了,那这个二级认证的功能也就没有意义了。

在业务上我们往往需要的四个方法,执行认证,判断是否认证,查看认证生效的剩余时间,取消认证(让认证失效)。

从代码实现上看

认证需要存储token-service信息

判断是否认证有效(是否在认证时间内)就是去判断这个token-service信息是否存在了

查看认证生效的剩余时间就是获取一下token-service的剩余存储时间

取消认证(让认证失效)也就是手动去删除这个token-service信息了,一般来说在退出登录的时候需要取消认证信息。

而存储删除等持久化操作则使用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

代码实现

有了思路后代码实现其实就很简单了,无非就是存储信息,判断信息是否存在和删除信息了。

执行认证

https://github.com/weloe/token-go/blob/9d1a8be2c16559d46460c82b33995b789e6e31c4/enforcer.go#L646

首先校验参数,在执行认证前需要判断一下是否登录,不然怎么说是二级认证?存储token和service信息,调用logger,最后调用watcher提供扩展点。

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
}

判断是否认证

https://github.com/weloe/token-go/blob/ac8674dc3ebbd4bcb213328b43f4c11678191919/enforcer.go#L665

判断是否认证即是判断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 != ""
}

查看认证生效的剩余时间

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
}

取消认证

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

标签:封装,service,err,认证,token,go,string
From: https://www.cnblogs.com/weloe/p/17740472.html

相关文章

  • go-ethereum设置signer
    设置代码:packagemain//签名用的公钥私钥也是采用的owner的公钥私钥import( "fmt" "set_signer/triplec" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethc......
  • 点云配准算法-旋转矩阵估计-Kabsch-Umeyama algorithm
    Kabsch-Umeyamaalgorithm参考文献:https://www.wikiwand.com/en/Kabsch_algorithm面向点云配准,最小化两点集均方根误差(RMSD,rootmeansquareddeviation)来计算最佳旋转矩阵。注:该算法只能计算旋转矩阵,做点云配准还需要计算平移向量。当平移和旋转都正确计算出,该算法有......
  • javascript: Sorting Algorithms
     //SortingAlgorithmsintJavaScripthttps://www.geeksforgeeks.org/sorting-algorithms//***fileSort.js*1.BubbleSort冒泡排序法*@paramarry*@paramnszie*/functionBubbleSort(arry,nszie){vari,j,temp;varswapped;for(i=0;i......
  • 10 Rules of Good and Bad Studying 学习的10条好与坏规则
    10RulesofGoodStudying良好学习的10条法则Userecall.Afteryoureadapage,lookawayandrecallthemainideas.Highlightverylittle,andneverhighlightanythingyouhaven’tputinyourmindfirstbyrecalling.Tryrecallingmainideaswhenyouare......
  • 5.go语言函数提纲
    1本篇前瞻前端时间的繁忙,未曾更新go语言系列。由于函数非常重要,为此将本篇往前提一提,另外补充一些有关go新版本前面遗漏的部分。需要恭喜你的事情是本篇学完,go语言中基础部分已经学完一半,这意味着你可以使用go语言去解决大部分的Leetcode的题,为此后面的1篇,将带领大家去巩固go语......
  • MongoDB使用教程
    一、基本概念一)数据库(database)数据库是一个仓库,在仓库中可以存放集合二)集合(collection)集合类似于数组,在集合中可以存放文档三)文档(document)文档是数据库中的最小单位,存储和操作的内容都是文档在MongoDB中,数据库和集合都不需要手动创建,当我们创建文档时,如果文档所在的集合或......
  • MongoDB搭建
    一、Docker-composeversion:'3'services:mongodb:image:mongocontainer_name:mongodbrestart:alwaysports:-27017:27017volumes:-/var/docker/server/mongodb/database:/data/dbenvironment:-MONGO_......
  • Go结构体深度探索:从基础到应用
    在Go语言中,结构体是核心的数据组织工具,提供了灵活的手段来处理复杂数据。本文深入探讨了结构体的定义、类型、字面量表示和使用方法,旨在为读者呈现Go结构体的全面视角。通过结构体,开发者可以实现更加模块化、高效的代码设计。这篇文章旨在为您提供关于结构体的深入理解,助您更好地......
  • GO语言实战之接口实现与方法集
    写在前面嗯,学习GO,所以有了这篇文章博文内容为《GO语言实战》读书笔记之一主要涉及知识接口是什么方法集(值接收和指针接收)多态傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺了。当时我是个年轻人,但我害怕这样生活下去,衰老下去。在我看来,这是比......
  • mongodb 导入导出数据
    导入数据C:\mongodb\bin>mongoimport--dbchapterenglish--collectionuserTable--filec:\userTable.jsonC:\mongodb\bin>mongoimport--dbjunxin--collectionproduct--jsonArray/jsit/junxin/junxinData.json 导出数据C:\mongodb\bin>mongoexport-hlo......