经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
用go封装一下临时token
来源:cnblogs  作者:秋玻  时间:2023/10/30 9:17:48  对本文有异议

用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

原文链接:https://www.cnblogs.com/weloe/p/17794231.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号