V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
YiweiHangzhi
V2EX  ›  程序员

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

  •  
  •   YiweiHangzhi · Aug 30, 2018 · 6253 views
    This topic created in 2810 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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

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