2016-09-12 5 views
3

私はComeoninとGuardianを使用してユーザー認証を実装するサイトで作業しています。Guardianを使用して電子メールの確認URLを作成する

私は電子メール検証を実装中です。私はGuardianの関数を利用してJWTトークンを使ってURLを生成すると考えました。 this postによると、これは妥当な解決策のようです(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 

は、ここで私はこれまでに書いたコードです。アイデアは、ユーザーがリンクをクリックすると、 "電子メール"の要求をデータベースの電子メールアドレスと照合できるということです。

しかし、私はこれが悪い考えであると考えています。特に、リンクが電子メールでクリアテキストとして公開されるためです。

このSO postで概説されているパターンに従って、多分私は乱数を生成し、それをハッシュし(Comeoninを使用して)、それをユーザに対して保存して、代わりにそれを私の主張に入れますか?これはいいアイデアですか、私は完全にオフトラックですか?

ソリューションのこの部分が機能すると仮定して、ペイロードタイプを:email_verificationに設定しても問題ありませんか?電子メールを経由してJWTを送信

+0

しかし、私はこれが悪い考えであると仮定しています。特に、リンクが電子メールでクリアテキストとして公開されるためです。あなたが強力な秘密を使用する場合、あなたのアプローチを使用して問題はないはずです。AFAIK –

+0

正直言ってわかりません - 私はセキュリティに関しては経験がありません – Mitkins

+0

十分なトークンを集めれば電子メール経由)、レインボーテーブル攻撃などの技術を適用することは可能でしょうか?電子メール内のトークンのセキュリティが侵害された場合、同じ設定を使用しているため、ウェブサイトも同様です – Mitkins

答えて

1

は、完全に罰金限り強力な秘密が使用されている(それは輸送方法にもかかわらず、常に重要です)のコメントから

引用:

十分なトークン(電子メールでクリアテキスト)を収集すると、Rainbow Table攻撃などの手法を適用できる可能性があると私は推測しています。

そのため、強力な秘密を選択する必要があります。 JWTの最後の部分である署名は、base64UrlEncode(header),base64UrlEncode(payload)およびsecretというHMAC SHA256のような強力なハッシング関数の組み合わせです。複数のセキュリティに関する情報については、適切な説明は、あなたがすべてのクレーム内の実際の電子メールを置く必要はありませんjwt.io

実装

にあります。あなたのシリアライザは既にユーザIDをトークンに入れているので、email=trueのような単純なフィールドで十分です。ユーザーが一度だけ確認でき、強力な秘密を選択できることを確認してください。

+0

ユーザがいつでも(つまり、ユーザがアクティベーションリンクをクリックする前であっても)電子メールアドレスを変更できるようにすると、 - Webトークンがデータベースの電子メールアドレス用であることを確認する必要はありませんか? – Mitkins

+0

はい、1人のユーザーに対して異なる電子メールの検証をサポートしたい場合は、電子メールをトークンに格納することが正しい方法です!私の考えは、ちょうど最初の、単一の電子メールの検証に関するものでした。 –

関連する問題