如何生成唯一的令牌(用于电子邮件验证)?

use*_*000 6 random go

我想实现一个系统,在用户注册后,用户将收到一封电子邮件,其中包含一个链接以验证该电子邮件是否适用于该用户。

我生成用于验证电子邮件的令牌的方式是这样的:

import (
    "crypto/rand"
    "encoding/base64"
)

func generateToken() (string, error) {
    b := make([]byte, 35)
    _, err := rand.Read(b)
    if err != nil {
        return "", err
    }
    return base64.URLEncoding.EncodeToString(b), nil
}
Run Code Online (Sandbox Code Playgroud)

但是我想问的是这个方法行不行?如何让这个方法生成的所有token都是唯一的?

实施该系统的常规方法是什么?

请给我一些想法并告诉我这种生成令牌的方法是否好。

谢谢。

smc*_*art 5

查看https://pkg.go.dev/github.com/google/uuid#NewRandom

您可能需要考虑将其与电子邮件地址和到期日期/时间一起存储在数据库中,以便验证不会永远留在那里。您可能只想允许人们在 24 小时内或 7 天内进行验证,依此类推。有另一份工作,定期清理过期和未经验证的电子邮件。