用go封装一下临时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数据文章来源地址https://www.toymoban.com/news/detail-711165.html

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

到了这里,关于用go封装一下临时token的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 封装hutool工具生成JWT token

    这一步非常重要,否则部署项目会发生JCE cannot authenticate the provider BC BouncyCastle类是一个加密的第三方类,关闭它使用jdk自带的加密算法 GlobalBouncyCastleProvider.setUseBouncyCastle(false);

    2024年02月15日
    浏览(95)
  • 在vue项目中webSocket封装(传token)

            在websocket中,目前未提供修改请求头字段的方法,参考其他的一些文章,依照他们的写法依然未能实现传递token,所有我和后端另辟蹊径,把token传在路径里面。         这样写就可以长久的建立链接。

    2024年04月29日
    浏览(29)
  • 【Go语言开发】简单了解一下搜索引擎并用go写一个demo

    这篇文章我们一起来了解一下搜索引擎的原理,以及用go写一个小demo来体验一下搜索引擎。 搜索引擎一般简化为三个步骤 爬虫:爬取数据源,用做搜索数据支持。 索引:根据爬虫爬取到的数据进行索引的建立。 排序:对搜索的结果进行排序。 然后我们再对几个专业名词做

    2024年02月16日
    浏览(44)
  • 简单对比一下 C 与 Go 两种语言

    以下内容为本人的学习笔记,如需要转载,请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/U6jIT837x5Yxe6Ev1aMDsA 使用一个简单的计数程序将古老的 C 语言与现代 Go 进行比较。 Go 是一种现代编程语言,追溯其历史大部分源自编程语言 C。所以,任何熟悉 C 语言的开发者

    2024年02月11日
    浏览(42)
  • 【JWT】SpringBoot+微信小程序根据指定参数生成Token、更新Token、判断Token是否已经过期、封装wx.request请求更新Token并判断Token是否过期

    微信小程序js代码 微信小程序点击登录按钮调用该方法 java后端代码 getUserCode方法为获取用户的唯一标识openId userLogin方法用于用户授权登录并获取Token userLogin实现类方法 封装了wx的request请求,每次发起请求的时候都走一遍更新Token的接口/user/updateTokenTime,如果接口返回offlin

    2024年02月04日
    浏览(53)
  • uniapp 前端定时刷新token,接口排队等待,promise 接口封装

           此项目为小程序。小程序完成第一版token刷新设计思路是:根据接口调用返回的errorCode来判断当前用户的token和refreshToken是否过期。根据不同的errorCode,前端去调用接口完成token的刷新或者跳转到登录页面重新登录。        由于小程序的用户功能权限可以在后台管理

    2024年02月09日
    浏览(76)
  • axios封装终极版实现token无感刷新及全局loading

    前言 关于axios全局loading的封装博主已经发过一次了,这次是在其基础上增加了token的无感刷新。 token无感刷新流程 首次登录的时候会获取到两个token(AccessToken,RefreshToken) 持久化保存起来(localStorage方案) 正常请求业务接口的时候携带AccessToken 当接口口返回401权限错误时,

    2024年02月21日
    浏览(42)
  • 【玩转AI】高效在本地部署Auto-GPT服务,轻松玩转AI创作(也可以先体验一下,不用token也可以用)

    在使用Auto-GPT之前,可以先体验下 AgentGPT https://agentgpt.reworkd.ai/ 此项目基于Auto-GPT构建,输入目的即可看到系统自动运行,并展示结果。 Auto-GPT是Github上的一个免费开源项目,结合了GPT-4和GPT-3.5技术,通过API创建完整的项目。与ChatGPT不同的是,用户不需要不断对AI提问以获得对

    2024年02月08日
    浏览(50)
  • go语言(十)---- 面向对象封装

    面向对象的封装 可以看出修改后,li4,数据并没有变化 如果加入指针,进行li4的修改后,数据会发生变化 如果首字母大写,表示其他包也能够访问 如果类的属性首字母大写,表示该属性对外是能够访问的,否则的话,只能类的内部访问。

    2024年01月20日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包