码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 用go封装一下临时token


    合集 - token-go(8)
    1.用go设计开发一个自己的轻量级登录库/框架吧(项目维护篇)05-112.用go设计开发一个自己的轻量级登录库/框架吧05-063.用go设计开发一个自己的轻量级登录库/框架吧(业务篇)05-134.用go设计开发一个自己的轻量级登录库/框架吧(拓展篇)05-215.用go封装一下封禁功能05-256.用go封装一下二级认证功能10-027.用go封装和实现扫码登录10-17
    8.用go封装一下临时token10-28
    收起

    1|0用go封装一下临时token

    本篇为用go设计开发一个自己的轻量级登录库/框架吧 的临时token篇,会讲讲临时token的实现,给库/框架增加新的功能。

    Github:https://github.com/weloe/token-go

    临时token也算是比较常见的业务,例如登录验证码信息,邀请链接等等,都属于临时token的范畴。

    在token-go中同样使用Adapter组件进行了简单的封装。

    1|1封装思路

    对于一个登录验证码,我们需要有创建,有效期,需要解析,需要能删除的功能。

    因此,我们需要创建临时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

    1|2代码实现

    1|0创建临时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 }

    1|0获取剩余时间

    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)) }

    1|0解析临时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) }

    1|0删除临时token

    https://github.com/weloe/token-go/blob/90e576f01537c92b924670dee3e32b8d7f010585/enforcer_manager_api.go#L248

    删除临时token则是从Adapter组件中删除对应的k,v数据

    func (e *Enforcer) DeleteTempToken(service string, tempToken string) error { return e.deleteByTempToken(service, tempToken) }

    1|0测试

    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

    __EOF__

    本文作者:秋玻
    本文链接:https://www.cnblogs.com/weloe/p/17794231.html
    关于博主:评论和私信会在第一时间回复。或者直接私信我。
    版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
    声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
  • 相关阅读:
    【验证码逆向专栏】螺丝帽人机验证逆向分析
    微软宣布 S2C2F 已被 OpenSSF 采用
    ADC的数据读取问题
    post给后端传递数组和多个参数
    洛谷P3758 可乐
    YOLOv7训练数据集
    Pod 管理与使用
    流程编排、如此简单-通用流程编排组件JDEasyFlow介绍
    MFC嵌入Qt窗口详细指导
    【C++】模板进阶
  • 原文地址:https://www.cnblogs.com/weloe/p/17794231.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号