Django備忘録: 管理画面のパスワードリセットにメールを使う
Djangoの管理画面のパスワードリセットにメールアドレス認証を実装する機会があったので、記事にまとめてみました。 公式ドキュメントを参考に実装しています。
Django の admin サイト | Django documentation | Django
GitHubに実装を公開しています。
目次
Djangoの初期設定
Djangoのマネージドコマンドを使ってプロジェクトの初期化を行います。
$ django-admin startproject django_admin_email
URLの追加
Djangoは管理画面のパスワードリセットのURL設定を追記するだけで設定できます。
URLの name
はテンプレートで決められているため、変えられません。
urls.pyに以下を追記する。
from django.contrib import admin from django.contrib.auth import views as auth_views from django.urls import path urlpatterns = [ path('admin/', admin.site.urls), path( 'admin/password_reset/', auth_views.PasswordResetView.as_view(), name='admin_password_reset', ), path( 'admin/password_reset/done/', auth_views.PasswordResetDoneView.as_view(), name='password_reset_done', ), path( 'reset/<uidb64>/<token>/', auth_views.PasswordResetConfirmView.as_view(), name='password_reset_confirm', ), path( 'reset/done/', auth_views.PasswordResetCompleteView.as_view(), name='password_reset_complete', ), ]
/admin/login
にアクセスするとログイン画面にパスワードリセットのリンクが追加されます。
管理画面のログインのテンプレートHTMLを確認してみましょう。
password_reset_url
がURLに登録されているかで、リンクを出し分けていることがわかります。
django/login.html at master · django/django · GitHub
{% if password_reset_url %} <div class="password-reset-link"> <a href="{{ password_reset_url }}">{% trans 'Forgotten your password or username?' %}</a> </div> {% endif %}
Gmailで送ってみる
開発環境でのメール送信はc-bataさんの記事が参考にになります。
ここではGmailを使ったメール送信を設定してみます。
settings.pyに以下の設定を追加します。 EMAIL_HOST_USER
, EMAIL_HOST_PASSWORD
は適宜変更してください。
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_USE_TLS = True EMAIL_HOST = 'smtp.gmail.com' EMAIL_HOST_USER = 'example@gmail.com' EMAIL_HOST_PASSWORD = 'password' EMAIL_PORT = '587'
送信する前にGoogle側のパスワード設定を変える必要があります。
アカウント設定の「ログインとセキュリティ」から「 安全性の低いアプリの許可」をONにします。
実際に送られたメールはこちら。
このメールは 0.0.0.0:8000 で、あなたのアカウントのパスワードリセットが要求されたため、送信されました。 次のページで新しいパスワードを選んでください: http://0.0.0.0:8000/reset/MQ/xxxxxxxxxxxxxxxxx/ あなたのユーザー名 (念のため): keinuma ご利用ありがとうございました! 0.0.0.0:8000 チーム
ローカル感丸出しですが無事に送れました。
SendGridやAWS SESを組み込んだメール送信もやってみたいです。