gpt4 book ai didi

elixir - 使用 Guardian 创建电子邮件验证 URL

转载 作者:行者123 更新时间:2023-12-02 09:56:14 27 4
gpt4 key购买 nike

我正在开发一个实现用户身份验证的网站(使用 Comeonin 和 Guardian)。

我正在实现电子邮件验证。我想我可以利用 Guardian 中的功能来使用 JWT token 生成 url。根据this post ,这似乎是一个可行的解决方案(只要 url 使用 https 并且 token 在相对较短的时间内过期)。

这是我到目前为止编写的代码:

def email_verification( user = %User{} ) do
if ( user.email != nil ) do
claims = Guardian.Claims.app_claims
|> Map.put("email", user.email)
|> Guardian.Claims.ttl({1, :hours})

{ :ok, jwt, full_claims } = Guardian.encode_and_sign(user, :email_verification, claims)

Zoinks.Mailer.send_verification_email( user.email, jwt )
end
end

我已将电子邮件地址作为声明输入。我的想法是,一旦用户单击链接,我就可以将“电子邮件”声明与数据库中的电子邮件地址进行匹配。

但是,我认为这是一个坏主意 - 特别是因为链接将通过电子邮件以明文形式公开。

遵循此 SO post 中概述的模式,也许我可以生成一个随机数,对其进行散列(使用 Comeonin),将其存储在用户中并将其作为我的声明?这是个好主意,还是我完全偏离了轨道?

假设我使解决方案的这一部分正常工作,是否可以将有效负载类型设置为 :email_verification

最佳答案

通过电子邮件发送 JWT 是完全可以的,只要使用强 secret (但这始终很重要,尽管传输方法不同)

引用评论:

I'm assuming that if you collect enough tokens (clear text via email), then it might be possible to apply a technique such as a Rainbow Table attack?

这就是为什么你应该选择一个强大的 secret 。 JWT 的最后一部分(签名)是 base64UrlEncode(header)base64UrlEncode(payload)secret 的组合,放入强哈希函数,如 HMAC SHA256。有关更多安全信息,jwt.io 上有很好的描述。

实现

您根本不需要将实际的电子邮件放入声明中。像 email=true 这样的简单字段应该足够了,因为您的序列化程序已经将用户 ID 放入 token 中。只需确保用户只能验证一次并选择一个强 secret 即可!

关于elixir - 使用 Guardian 创建电子邮件验证 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39452851/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com