1. ホーム
  2. django

[解決済み] Django - メールでログイン

2022-09-19 09:23:30

質問

django にユーザ名ではなく、電子メールでユーザを認証させたいのです。一つの方法として、ユーザ名の値として電子メールの値を提供することができますが、私はそれをしたくありません。理由は、私はURLを持っている /profile/<username>/ であり、それ故に私は url を持つことができません。 /profile/[email protected]/ .

もう一つの理由は、すべてのメールは一意ですが、ユーザ名がすでに取られていることがあるからです。そこで、私はユーザー名を fullName_ID .

Django が電子メールで認証するようにするにはどうすればよいですか?

これはユーザを作成する方法です。

username = `abcd28`
user_email = `[email protected]`
user = User.objects.create_user(username, user_email, user_pass)

このようにログインします。

email = request.POST['email']
password = request.POST['password']
username = User.objects.get(email=email.lower()).username
user = authenticate(username=username, password=password)
login(request, user)

ユーザー名を最初に取得する以外に、ログインの方法はありますか?

どのように解決するのですか?

カスタム認証バックエンドを作成する必要があります。このようなものが有効です。

from django.contrib.auth import get_user_model
from django.contrib.auth.backends import ModelBackend

class EmailBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        UserModel = get_user_model()
        try:
            user = UserModel.objects.get(email=username)
        except UserModel.DoesNotExist:
            return None
        else:
            if user.check_password(password):
                return user
        return None

次に、設定でそのバックエンドを認証バックエンドとして設定します。

AUTHENTICATION_BACKENDS = ['path.to.auth.module.EmailBackend']

更新 . を継承しています。 ModelBackend のようなメソッドを実装しているので get_user() のようなメソッドを実装しているためです。

ドキュメントはこちら。 https://docs.djangoproject.com/en/3.0/topics/auth/customizing/#writing-an-authentication-backend