V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cobyx
V2EX  ›  程序员

WebApi 如何实现二维码过期?

  •  
  •   cobyx · 2021-04-01 17:37:49 +08:00 · 2890 次点击
    这是一个创建于 1331 天前的主题,其中的信息可能已经有所发展或是发生改变。

    是这样的,有一个签到的需求,为了防止拍照二维码给别人扫签到,所以想弄一个二维码过期的功能 求实现思路

    27 条回复    2021-04-02 22:22:21 +08:00
    hjosama
        1
    hjosama  
       2021-04-01 17:43:30 +08:00
    把二维码指向的链接加上时间戳,然后链接的请求接口进行控制,业务逻辑上,将请求过来的时间戳进行分析,然后判断时间区间,然后就可以设置过期时间了
    zhoudaiyu
        2
    zhoudaiyu  
       2021-04-01 17:43:35 +08:00 via iPhone
    延迟队列?时间轮?
    2kCS5c0b0ITXE5k2
        3
    2kCS5c0b0ITXE5k2  
       2021-04-01 17:45:03 +08:00
    肯定是带 token 后台判断拉. 这种不是很简单吗
    hjosama
        4
    hjosama  
       2021-04-01 17:45:36 +08:00
    只要请求的时间戳大于链接生成时的时间戳比如 5 分钟,就判断为过期
    2kCS5c0b0ITXE5k2
        5
    2kCS5c0b0ITXE5k2  
       2021-04-01 17:45:40 +08:00
    再加上定位 完美解决拍照二维码给别人扫签到
    imn1
        6
    imn1  
       2021-04-01 17:46:30 +08:00
    两个简单思路,应该还有其他的
    1. 字串是动态的,隐含时间信息
    2. 生成的图片是有时效的
    应该第一个更广泛,甚至可以客户端判断失效,无需传到服务器端才判断,反正跟身份验证器的数字一个意思
    hjosama
        7
    hjosama  
       2021-04-01 17:46:44 +08:00
    @emeab 原来如此!哥哥好聪明,根据 token 直接就知道是谁扫的二维码了,防止别人扫了,好厉害!
    telung
        8
    telung  
       2021-04-01 17:46:48 +08:00   ❤️ 3
    招一个人坐在那边对着表格看是不是过期
    hjosama
        9
    hjosama  
       2021-04-01 17:48:03 +08:00
    @telung 噗嗤,这种人力劳动好可爱
    alan0liang
        10
    alan0liang  
       2021-04-01 17:49:43 +08:00 via Android
    之前想过这个问题,直播( Zoom,腾讯会议)可以绕过一切只靠时间判断的检测
    2kCS5c0b0ITXE5k2
        11
    2kCS5c0b0ITXE5k2  
       2021-04-01 17:50:46 +08:00
    @hjosama 我的说的 token 和你说的时间戳是一个意思.
    2kCS5c0b0ITXE5k2
        12
    2kCS5c0b0ITXE5k2  
       2021-04-01 17:51:42 +08:00
    但是时间戳太容易被生成了. 所以建议后台维护一个短期 token. 来判断.
    mogg
        13
    mogg  
       2021-04-01 17:51:50 +08:00
    `为了防止拍照二维码给别人扫签到`这个需求我想起来一个叫“猫途校园的小程序”,每个人自己生成一个二维码,已经签到的人 A 扫 B 的二维码可以让 B 也签到。
    hjosama
        14
    hjosama  
       2021-04-01 17:52:54 +08:00
    @emeab 感觉这样还是好麻烦呢,不让别人扫的话,进行身份校验不是更快吗
    cobyx
        15
    cobyx  
    OP
       2021-04-01 18:07:45 +08:00
    @emeab 目前我也是打算后台存个短期 token 判断,但是不知道大概设置多久的有效期? 5s 30s?时间长了还是会被拍照扫吧。。
    2kCS5c0b0ITXE5k2
        16
    2kCS5c0b0ITXE5k2  
       2021-04-01 18:12:18 +08:00
    @cobyx 那就再加上用户识别 + 定位
    JmmBite
        17
    JmmBite  
       2021-04-01 18:14:13 +08:00
    定位 + token + 隐藏水印(拍照后不显示那种)
    cobyx
        18
    cobyx  
    OP
       2021-04-01 18:16:44 +08:00
    @emeab 目前就这样吧,加定位的话改的太多了,谢谢
    Wincer
        19
    Wincer  
       2021-04-01 18:17:14 +08:00
    这种情况完全用不着后台存 token,担心时间戳被攻破可以加密一下再集成到 URL 里(许多库是做这个的( Python 有 itsdangerous )),验证过期时,直接解密除时间然后算与当前时间的 diff 就行。嫌加解密自己实现麻烦的话,使用 JWT
    opengps
        20
    opengps  
       2021-04-01 18:18:01 +08:00
    二维码就是个网址,网址带一个参数(叫做 token 也行,ticket 也罢),然后这个参数,后台做记录,扩展出创建时间之类的,访问网址就通过扩展信息去判断
    eason1874
        21
    eason1874  
       2021-04-01 18:23:02 +08:00
    这个看你的 token 有没有状态,有状态你直接存多一个有效期就行了。

    无状态就用 JWT,expires_in 设置一分钟,就可以了。
    yujiang
        22
    yujiang  
       2021-04-01 18:25:47 +08:00 via Android
    集成到微信里要求绑定微信用户?
    jmk92
        23
    jmk92  
       2021-04-01 18:27:24 +08:00
    前端 js 实现过期,后端也是过期的逻辑,为了避免误差,比前端多个几秒。
    二维码是个网址,完全可以带个参数,防止生成还可以用可逆的加密,比如把当前时间作为参数,你后端不方便判断吗。
    noobma
        24
    noobma  
       2021-04-01 18:47:34 +08:00
    放 redis 吧,key 设置过期时间,如果签到使用后把 key 删掉
    zjb861107
        25
    zjb861107  
       2021-04-01 19:43:24 +08:00
    参数添加一个没用的字符串,生成一个比较长的 URL 。这样当场扫码还好一点,但是拍照以后再给别人扫,因为拍照的光照和角度原因就不容易成功了。

    至于具体这个随机的字符串要多长,可以 A/B 测试根据具体效果来调整
    tonyaiken
        26
    tonyaiken  
       2021-04-01 23:57:11 +08:00 via iPhone
    @hjosama 时间戳明文会被伪造吧?
    dingwen07
        27
    dingwen07  
       2021-04-02 22:22:21 +08:00 via iPhone
    用 OATH-TOTP 生成一个 30 秒有效期的 OTP 加在二维码的链接里,明文还是加密随意
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2818 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 02:44 · PVG 10:44 · LAX 18:44 · JFK 21:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.