Python Django 入門トップページ


カスタムユーザ認証

  1. プロジェクトの概要
  2. プロジェクトの作成と初期設定
  3. Users アプリケーションの作成と有効化
  4. 認証にカスタムユーザモデルを利用する
  5. モデルの作成
  6. マイグレーション
  7. ユーザの登録
  8. 管理ユーザの登録
  9. 管理サイトの作成
  10. Comments アプリケーションの作成
  11. ページ雛形の作成
  12. ログイン・ログアウトの実装
  13. Navbar の設置
  14. Comments アプリケーションのユーザ認証
  15. ユーザ一覧ページ
  16. ユーザ詳細情報の表示
  17. ユーザ情報の更新
  18. パスワードの変更
  19. Gmail 2段階認証の設定とアプリパスワードの取得
  20. メールの設定と送信
  21. パスワードのリセット
  22. ユーザ登録機能の実装
  23. ユーザ登録時に氏名も登録
  24. ユーザ登録時にメールアドレスも登録
  25. ユーザ登録してもログインできないように
  26. ユーザ登録後にメールを送信
  27. メール検証によるアカウントの有効化
  28. トークン有効期限の変更
  29. ログアウト後に top へリダイレクト
  30. 検証メールの再送信
  31. 未検証ユーザのログインエラーメッセージ
  32. メールに有効期限を表示
  33. フラッシュメッセージの変更
  34. 未検証ユーザのパスワードリセット

カスタムユーザ認証

メール検証によるアカウントの有効化

ユーザ登録後のメール送信までの機能が実装できたので,ここではメールリンクのクリックでユーザアカウントが有効化される機能を実装しよう.

このためには views.py を編集します.

users/views.py
def creation_confirm(request, uidb64, token):

    def get_user(uidb64, request):
        try:
            # urlsafe_base64_decode() decodes to bytestring
            uid = urlsafe_base64_decode(uidb64).decode()
            # messages.success(request, f'uidb64 = {uidb64} に対応する uid は {uid} です')
            user = UserModel._default_manager.get(pk=uid)
        except (TypeError, ValueError, OverflowError, UserModel.DoesNotExist, ValidationError):
            user = None
        return user

    user = get_user(uidb64, request)
    if user is not None:
        if default_token_generator.check_token(user, token):
            if user.is_active == True:
                messages.success(request, f'すでに検証できています.ログインしてください.')
                return HttpResponseRedirect("/")
            user.is_active = True
            user.save()
            messages.success(request, f'メールを検証ができたので,ユーザ登録を完了しました.')
            return HttpResponseRedirect("/")
        else:
            messages.success(request, f'不正なリンクです.トークンが異なります.')
            return HttpResponseRedirect("/")
    messages.success(request, f'不正なリンクです.ユーザが存在しません.')
    return HttpResponseRedirect("/")

ユーザ登録直後のデータベースを確認します.ユーザ user_e のis_active が 0 になっている(つまりまだ無効状態である)ことが確認できます.

sqlite> select id, username, is_active, email from users_user; ⏎
id|username|is_active|email
1|user_a|1|a@sample.com
2|user_b|1|b@sample.com
3|user_c|1|c@sample.com
4|root|1|root@example.com
5|user_f|0|f@sample.com
6|user_e|0|e@sample.com
sqlite>

ユーザ user_e の(実際は受信可能な)メールアドレスに送信された電子メールのリンクをクリックしてアカウントを有効化します.

django2022-00349

データベースを確認すると is_active が 1 になり,アカウントが有効化されていることがわかりました.

sqlite> select id, username, is_active, email from users_user; ⏎
id|username|is_active|email
1|user_a|1|a@sample.com
2|user_b|1|b@sample.com
3|user_c|1|c@sample.com
4|root|1|root@example.com
5|user_f|0|f@sample.com
6|user_e|1|e@sample.com
sqlite>

同じリンクをもう一度開いた場合は,「すでに検証できています」というメッセージが表示されます.

django2022-00350

なお,ユーザに送信されるリンクは【/users/create/[ユーザID]/[有効期限]-[ハッシュ]/】の形式になっています.詳細は Django contrib の auth にある tokens.py のコードを参照してください.

たとえばメールリンクの [ユーザID] に該当する部分の文字列を書き換えてアクセスしても「不正なリンク」と判断されます.

django2022-00351

同様に [ハッシュ] に該当する部分の文字列を書き換えてアクセスしても「不正なリンク」と判断されます.

django2022-00352

なお,[有効期限] はメール送信から72時間です.次のページでは [有効期限] を変更して動作のテストを行います.

目次に戻る