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

不使用 redis,关于邮箱验证码过期实现,请教一下?

  •  
  •   YiweiHangzhi · 2018-08-30 09:28:37 +08:00 · 5563 次点击
    这是一个创建于 2037 天前的主题,其中的信息可能已经有所发展或是发生改变。

    也是一个业务需求,如题,有曾经实现过的大佬嘛?能否给个例子或文章链接参考一下

    52 条回复    2018-09-01 01:00:13 +08:00
    Mazexal
        1
    Mazexal  
       2018-08-30 09:30:23 +08:00
    存数据库
    Light3
        2
    Light3  
       2018-08-30 09:44:30 +08:00
    mysql 存一条 里面有个过期时间 不就完了吗
    rockyou12
        3
    rockyou12  
       2018-08-30 09:45:15 +08:00
    数据库存过期时间,然后程序轮询
    tlday
        4
    tlday  
       2018-08-30 09:48:26 +08:00 via iPhone   ❤️ 5
    不需要轮询让他失效,用的时候查一下是不是在有效期内就可以了。
    matzoh
        5
    matzoh  
       2018-08-30 09:49:21 +08:00   ❤️ 1
    @rockyou12 这是有多笨的方法。。 存个时间不就行了。。
    batter
        6
    batter  
       2018-08-30 10:04:05 +08:00
    表里面添加一条数据,设置过期时间就可以了
    ieiayaobb
        7
    ieiayaobb  
       2018-08-30 10:09:25 +08:00
    我们之前有一种很 trick 的做法是用 JWT,也有 ttl,可以在验证签名的时候校验
    Shynoob
        8
    Shynoob  
       2018-08-30 10:10:20 +08:00
    相比问题我更好奇为什么不使用 redis
    tomfs
        9
    tomfs  
       2018-08-30 10:14:50 +08:00
    简单需求没必要弄卡车来跑吧,memcached 就足够了吧
    Zzdex
        10
    Zzdex  
       2018-08-30 10:15:58 +08:00 via iPhone
    用 jwt
    willchen
        11
    willchen  
       2018-08-30 10:18:52 +08:00
    嗯 jwt 可以,大致就是把过期时间 加密后 作为参数
    rockyou12
        12
    rockyou12  
       2018-08-30 10:27:36 +08:00
    @matzoh 过期的时候可能需要触发其他业务,只存时间很多时候都不行。redis 本身 key 可以设置过期时间,而且可以订阅其事件达到一过期就自动触发业务,你只用数据库那不就只能轮询了。
    Hayek
        13
    Hayek  
       2018-08-30 10:29:41 +08:00
    @rockyou12 如果我带的程序员这么写需求,会被打死。

    @Shynoob 如果一个很小的系统,仅仅这一个新需求,有必要上 Redis 吗?增加一个新的数据库,要不要人来日常维护。

    @willchen 为了用 jwt 而用 jwt,如果只给用户邮箱里发一个验证码,jwt 如何给用户?
    alwayshere
        14
    alwayshere  
       2018-08-30 10:35:43 +08:00
    用数据库存时间也是醉了,你把时间用个可逆式加密的函数写进验证码不就行了吗,后端验证的时候解密验证时间不就行了
    lerry
        15
    lerry  
       2018-08-30 10:37:15 +08:00   ❤️ 1
    base64(过期时间$用户 id$sha1(过期时间+用户 id+secret_key))

    请求的时候,服务器拆开过期时间和用户 id(或者 token) 和哈希值,检查时间是否到期,对过期时间、用户 id、密钥做哈希,检查是否一致

    并不需要用数据库
    rockyou12
        16
    rockyou12  
       2018-08-30 10:38:18 +08:00
    @Hayek 我又不是写需求,我是在解释为什么用 redis 比较好,还有为什么数据库轮询可以达到一样的效果。领导当惯了口气不小啊?(´・_・`)
    rockyou12
        17
    rockyou12  
       2018-08-30 10:40:04 +08:00
    @lerry 其实感觉和 jwt 差不多了……
    Hayek
        18
    Hayek  
       2018-08-30 10:40:23 +08:00
    @rockyou12 哈哈,抱歉了,不是领导,底层码农而已,偶尔带新人。您说的情况下确实 redis 好,然而楼主并没有说过期之后要触发什么需求,我只是不太喜欢过度优化,简单需求复杂化而已。
    choice4
        19
    choice4  
       2018-08-30 10:49:16 +08:00
    guava 呢
    Shynoob
        20
    Shynoob  
       2018-08-30 10:50:28 +08:00
    @Hayek 回复一下楼主,好巧我上周也写了一个同样的功能,最后选的还是 redis 的方案,方便
    loveCoding
        21
    loveCoding  
       2018-08-30 10:59:02 +08:00
    在 url 上带个过期时间的加密参数,前提是别让人解出来
    wplct
        23
    wplct  
       2018-08-30 11:06:55 +08:00
    楼上有些程序员的方案怕不是要被打死
    rockyou12
        24
    rockyou12  
       2018-08-30 11:29:08 +08:00
    @Hayek 确实如果只是个单体小应用数据库都不需要……(─.─||)

    但如果是给公司开发,redis 基本都是标配了吧。redis 功能太多太好用……好多时候没有真的不晓得怎么开发……
    tt67wq
        25
    tt67wq  
       2018-08-30 11:32:20 +08:00
    jwt 可以做的吧
    willchen
        26
    willchen  
       2018-08-30 11:37:10 +08:00
    @Hayek 我用过的邮箱验证码都是链接 逃),说 jwt 是能让一个链接同时搞定认证用户 id 和有效时间,只需要有效时间的话,就是我说的后半句话。
    zsdroid
        27
    zsdroid  
       2018-08-30 11:39:02 +08:00
    @alwayshere #14 数字验证码了解下
    ipwx
        28
    ipwx  
       2018-08-30 11:44:41 +08:00 via iPhone
    数据库存时间,后台任务定期轮询,反正时间序基本等于自然序,处理完开头的记录就可以等下一次轮询了,基本没有效率损失。
    aa6563679
        29
    aa6563679  
       2018-08-30 11:46:19 +08:00
    把过期时间加密写到验证码里面
    reus
        30
    reus  
       2018-08-30 11:47:16 +08:00
    验证码太短,肯定要数据库,如果是验证 url,可以把过期时间和其他信息打包然后做 aes 之类的对称加密,验证时看记录的时间就行
    yejinmo
        31
    yejinmo  
       2018-08-30 11:53:33 +08:00
    List + 维护线程
    derrickT
        32
    derrickT  
       2018-08-30 12:20:41 +08:00
    时间戳作为参数然后加密,验证的时候解密就可以了
    opengps
        33
    opengps  
       2018-08-30 12:22:32 +08:00
    存哪都行,只要带着时间就可以,验证时候检测是否超期,或者直接超期数据自动删掉
    liuqitoday
        34
    liuqitoday  
       2018-08-30 12:26:43 +08:00 via Android
    jwt
    reself
        35
    reself  
       2018-08-30 12:41:10 +08:00 via Android
    @Hayek shut your mouth and show me your code。diss 别人时请拿出自己的方案。
    d5
        36
    d5  
       2018-08-30 12:43:13 +08:00 via iPhone
    jwt 思路不错
    reself
        37
    reself  
       2018-08-30 12:47:07 +08:00 via Android
    假设这里的 redis 统指服务端存储。这就是一个 token 到过期信息的 map,就看把过期信息存储到哪里。可以考虑 jwt 或者类似的把信息存储到客户端的方案。甚至可以考虑区块链,把信息存到网络上。
    honeycomb
        38
    honeycomb  
       2018-08-30 12:48:00 +08:00 via Android
    jwt 的 TTL,布隆过滤器什么的都可以
    wfd0807
        39
    wfd0807  
       2018-08-30 12:55:33 +08:00   ❤️ 4
    这个帖子暴露了 V2 的部分程序员的水平,好帖子~
    wfd0807
        40
    wfd0807  
       2018-08-30 13:04:35 +08:00   ❤️ 1
    先分析问题,再给解决方案
    楼上那些上来就给方案的,我想问问,你们确定知道楼主要做的是"验证邮箱"还是"接收验证码"吗?
    wfd0807
        41
    wfd0807  
       2018-08-30 13:06:30 +08:00   ❤️ 1
    最后还要喷一下楼主,要想别人提供有效的帮助,自己先学会高效的沟通
    lhx2008
        42
    lhx2008  
       2018-08-30 13:10:30 +08:00 via Android
    如果是 java 的话,guava cache 可以单机代替 redis
    mayne95
        43
    mayne95  
       2018-08-30 13:14:25 +08:00 via Android
    @wfd0807 他这个题干有毛病,“邮箱验证码” 2333
    panpanpan
        44
    panpanpan  
       2018-08-30 13:27:09 +08:00 via iPhone
    Jwt 贼适合干这事
    Hayek
        45
    Hayek  
       2018-08-30 14:16:51 +08:00
    @reself shut your mouth and read other replies. 楼上有人说了存一条过期时间就行了,我就没必要重复了。而且我并没有 diss 的意思,第一条回复可能被误解 diss,我已经道歉。
    哎,英文真是好,我还得查字典来回复您。
    Hayek
        46
    Hayek  
       2018-08-30 14:20:30 +08:00
    @willchen 是的,邮箱一般都是链接,楼主这个描述确实有问题。我觉得用 jwt 的话,那这个发给用的链接里面要把 jwt 的参数带上,这个链接就会很长。
    一般的网站的做法是生成一个加密字符串(大部分时候是加 salt 的 md5 ),数据里存下来,然后把这个加密字符串拼接到 url 里发送给客户。
    reself
        47
    reself  
       2018-08-30 14:29:06 +08:00 via Android
    @Hayek 抱歉,我也得为我的过激回复道歉。
    Hayek
        48
    Hayek  
       2018-08-30 14:36:12 +08:00
    @reself 🤝
    honeycomb
        49
    honeycomb  
       2018-08-30 16:48:27 +08:00 via Android
    @lhx2008 现在用 caffeine 比 guava cache 更好,前者是利用了 Java 8 的 concurrenthashmap 重写版的后者
    sky101001
        50
    sky101001  
       2018-08-31 11:37:06 +08:00 via iPad
    如果楼主的题干是指接收数字验证码,而不是链接
    那么我真的很想知道楼主的那个数字验证码是存在哪里的
    YiweiHangzhi
        51
    YiweiHangzhi  
    OP
       2018-08-31 14:41:02 +08:00
    @sky101001 我现在暂时先全存数据里了,验证码、有效状态、邮件发送时间三个字段
    mmdsun
        52
    mmdsun  
       2018-09-01 01:00:13 +08:00 via Android
    放 session 设置过期时间。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3525 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 00:48 · PVG 08:48 · LAX 17:48 · JFK 20:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.