如何为电子邮件创建确认链接?

时间:2015-08-19 04:45:48

标签: java database spring email

在我的项目中,我需要通过确认链接发送给用户电子邮件。 我的解决方案:

  1. 将字符串列“code”和布尔列“is_active”(默认值为false)添加到用户表。
  2. 用户注册时,生成唯一的字符串密钥并保存到数据库。发送至电子邮件链接,例如host.com/user/email/ {code} / confirm
  3. 然后通过代码(生成的字符串值)用户查找并设置标志“is_active” - true。
  4. 清除“代码”列的值。
  5. 您如何为电子邮件创建确认链接?

3 个答案:

答案 0 :(得分:6)

我使用类似的做法,但有以下不同之处:

  1. 我会设置网址,即host.com/user/email/{code}/confirm安全,以便用户必须登录才能验证自己。这确保了更高的安全性。例如,如果用户在注册时键入了错误的电子邮件ID,则该错误的人即使在收到邮件后也不应该验证。
  2. 我不会按code搜索,而是按id(当前登录用户的ID)获取用户。
  3. 对于代码,我使用UUID.randomUUID().toString()
  4. 此外,这取决于个人选择,但我不使用is_active标志。相反,我有一个roles集,我在其中设置了“未完成”角色。这有助于我在使用Spring Security时更轻松地填充用户的权限。另一种方法是检查code是否为null

答案 1 :(得分:1)

抱歉,为时已晚。您可以在链接中使用JWT令牌(例如/ email / {token})关于JWT的好处是您可以在其中签名userID(可以轻松解密,但这不是JWT的重点),但是令牌的签名是使用您的秘密密钥(及其本身的数据)进行加密,因此您可以在后端验证您是否发行了该令牌。另外,您可以在令牌中添加过期时间,以便“链接”在特定持续时间内有效。

答案 2 :(得分:0)

  1. 不要将“{code}”保留为1/0或任何可预测的值。让它是随机的(为该用户生成的唯一数字/密钥)

  2. 当用户通过链接确认时,不要只在db中查找代码=。验证密钥是否可能进行任何可能的注入。或者简单来说,如果代码逻辑是数字,那么接收代码应该被验证为数字

  3. 为了更安全,您还可以确认有效性。如果用户未在该期间内确认,则url无效。