Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 使用Guardian创建电子邮件验证url_Elixir_Jwt_Phoenix Framework_Email Verification - Fatal编程技术网

Elixir 使用Guardian创建电子邮件验证url

Elixir 使用Guardian创建电子邮件验证url,elixir,jwt,phoenix-framework,email-verification,Elixir,Jwt,Phoenix Framework,Email Verification,我正在一个实现用户身份验证(使用Comeonin和Guardian)的网站上工作 我正在实施电子邮件验证。我想我可以利用Guardian中的函数,使用JWT令牌生成url。根据,这似乎是一个合理的解决方案(只要url使用https并且令牌在相对较短的时间内过期) 以下是我迄今为止编写的代码: def email_verification( user = %User{} ) do if ( user.email != nil ) do claims = Guardian.Claims.

我正在一个实现用户身份验证(使用Comeonin和Guardian)的网站上工作

我正在实施电子邮件验证。我想我可以利用Guardian中的函数,使用JWT令牌生成url。根据,这似乎是一个合理的解决方案(只要url使用https并且令牌在相对较短的时间内过期)

以下是我迄今为止编写的代码:

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
我已经把电子邮件地址作为索赔。我的想法是,一旦用户点击链接,我就可以将“电子邮件”声明与数据库中的电子邮件地址进行匹配

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

按照本文概述的模式,也许我可以生成一个随机数,对它进行散列(使用Comeonin),针对用户存储它,并将其作为我的声明放进去?这是个好主意,还是我完全偏离了轨道


假设我让解决方案的这一部分正常工作,可以将有效负载类型设置为
:email\u verification

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

引用评论:


我假设,如果您收集了足够的令牌(通过电子邮件发送明文),那么可能会应用彩虹表攻击之类的技术

这就是为什么你应该选择一个强烈的秘密。JWT的最后一部分是签名,它是
base64UrlEncode(header)
base64UrlEncode(payload)
secret
的组合,并放入一个强大的散列函数中,如HMAC SHA256。有关更多安全信息,请参阅

实施


您根本不需要将实际的电子邮件放入索赔中。像
email=true
这样的简单字段就足够了,因为序列化程序已经将用户id放入令牌中。只需确保用户只能被验证一次,并选择一个强大的秘密

您对
的确切含义是什么?然而,我认为这是一个坏主意-尤其是因为链接将通过电子邮件以明文形式公开。
?如果你使用了一个强大的秘密,那么使用你的方法应该没有问题。老实说,我不确定-我在安全方面缺乏经验。我假设如果你收集了足够的令牌(通过电子邮件发送明文),那么可能会应用彩虹表攻击之类的技术?如果电子邮件中令牌的安全性受到破坏,那么网站也会受到影响-因为它使用相同的配置如果我允许用户随时更改其电子邮件地址(即,甚至在用户单击激活链接之前)-我是否需要确认web令牌是数据库中电子邮件地址的令牌?是,如果您希望支持为单个用户验证不同的电子邮件,那么将电子邮件存储在令牌中是正确的方法!我的想法只是初步的、单一的电子邮件验证。