用go封装一下临时token

打印 上一主题 下一主题

主题 895|帖子 895|积分 2685

用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
  1.         // Temp token api
  2.         CreateTempToken(token string, service string, value string, timeout int64) (string, error)
  3.         CreateTempTokenByStyle(style string, service string, value string, timeout int64) (string, error)
  4.         GetTempTokenTimeout(service string, tempToken string) int64
  5.         ParseTempToken(service string, tempToken string) string
  6.         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
  1. func (e *Enforcer) CreateTempTokenByStyle(style string, service string, value string, timeout int64) (string, error) {
  2.         token, err := e.generateFunc.Exec(style)
  3.         if err != nil {
  4.                 return "", err
  5.         }
  6.         err = e.setTempToken(service, token, value, timeout)
  7.         if err != nil {
  8.                 return "", err
  9.         }
  10.         return token, nil
  11. }
复制代码
指定token创建。
https://github.com/weloe/token-go/blob/90e576f01537c92b924670dee3e32b8d7f010585/enforcer_manager_api.go#L223
  1. func (e *Enforcer) CreateTempToken(token string, service string, value string, timeout int64) (string, error) {
  2.         if token == "" {
  3.                 return "", fmt.Errorf("token must not be empty")
  4.         }
  5.         err := e.setTempToken(service, token, value, timeout)
  6.         if err != nil {
  7.                 return "", err
  8.         }
  9.         return token, nil
  10. }
复制代码
获取剩余时间

https://github.com/weloe/token-go/blob/90e576f01537c92b924670dee3e32b8d7f010585/enforcer_manager_api.go#L234
同样是使用Adapter组件去获取剩余时间
  1. func (e *Enforcer) GetTempTokenTimeout(service string, tempToken string) int64 {
  2.         if tempToken == "" {
  3.                 return constant.NotValueExpire
  4.         }
  5.         return e.getTimeoutByTempToken(service, tempToken)
  6. }
复制代码
  1. func (e *Enforcer) getTimeoutByTempToken(service string, token string) int64 {
  2.         return e.adapter.GetTimeout(e.spliceTempTokenKey(service, token))
  3. }
复制代码
解析临时token

https://github.com/weloe/token-go/blob/90e576f01537c92b924670dee3e32b8d7f010585/enforcer_manager_api.go#L241
解析即是通过service,token去Adapter中获取对应的信息。
  1. func (e *Enforcer) ParseTempToken(service string, tempToken string) string {
  2.         if tempToken == "" {
  3.                 return ""
  4.         }
  5.         return e.getByTempToken(service, tempToken)
  6. }
复制代码
删除临时token

https://github.com/weloe/token-go/blob/90e576f01537c92b924670dee3e32b8d7f010585/enforcer_manager_api.go#L248
删除临时token则是从Adapter组件中删除对应的k,v数据
  1. func (e *Enforcer) DeleteTempToken(service string, tempToken string) error {
  2.         return e.deleteByTempToken(service, tempToken)
  3. }
复制代码
测试
  1. func TestEnforcer_TempToken(t *testing.T) {
  2.         enforcer, _ := NewTestEnforcer(t)
  3.         service := "code"
  4.         tempToken, err := enforcer.CreateTempToken("tempToken", service, "1234", -1)
  5.         if err != nil {
  6.                 t.Fatalf("CreateTempToken() failed: %v", err)
  7.         }
  8.         if !reflect.DeepEqual(tempToken, "tempToken") {
  9.                 t.Fatalf("token error, want is %v", "1234")
  10.         }
  11.         timeout := enforcer.GetTempTokenTimeout(service, tempToken)
  12.         if timeout != -1 {
  13.                 t.Errorf("GetTempTokenTimeout() failed, unexpected timeout: %v", timeout)
  14.         }
  15.         codeValue := enforcer.ParseTempToken("code", tempToken)
  16.         if codeValue != "1234" {
  17.                 t.Errorf("ParseTempToken() failed, unexpected codeValue: %v", codeValue)
  18.         }
  19.         // delete
  20.         if enforcer.DeleteTempToken(service, tempToken) != nil {
  21.                 t.Fatalf("DeleteTempToken() failed: %v", err)
  22.         }
  23.         tokenTimeout := enforcer.GetTempTokenTimeout(service, tempToken)
  24.         if tokenTimeout != -2 {
  25.                 t.Errorf("GetTempTokenTimeout() failed, unexpected tokenTimeout: %v", tokenTimeout)
  26.         }
  27.         codeValue = enforcer.ParseTempToken(service, tempToken)
  28.         if codeValue != "" {
  29.                 t.Errorf("ParseTempToken() failed, unexpected codeValue: %v", codeValue)
  30.         }
  31.         // create token
  32.         tempToken, err = enforcer.CreateTempTokenByStyle("uuid", service, "1234", -1)
  33.         if err != nil {
  34.                 t.Fatalf("CreateTempTokenByStyle() failed: %v", err)
  35.         }
  36.         // delete
  37.         if enforcer.DeleteTempToken(service, tempToken) != nil {
  38.                 t.Fatalf("DeleteTempToken() failed: %v", err)
  39.         }
  40. }
复制代码
  1. --- PASS: TestEnforcer_TempToken (0.01s)
  2. PASS
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

不到断气不罢休

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表