雑食日誌

Vue.jsとServerless。ときどきチーム開発

Django備忘録: 管理画面のパスワードリセットにメールを使う

Djangoの管理画面のパスワードリセットにメールアドレス認証を実装する機会があったので、記事にまとめてみました。 公式ドキュメントを参考に実装しています。

Django の admin サイト | Django documentation | Django

GitHubに実装を公開しています。

github.com

目次

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 にアクセスするとログイン画面にパスワードリセットのリンクが追加されます。

f:id:keinumata:20181119002406p:plain

管理画面のログインのテンプレート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を組み込んだメール送信もやってみたいです。