BETA

django rest framework でパスワード変更APIを作る

投稿日:2020-06-25
最終更新:2020-08-24

Django REST framework でパスワード変更

Django REST framework でパスワード変更APIを作ろうと思うと
たいていは用意されているメールを送信するタイプのパスワード変更APIを使うことになる

今回はメールとか面倒だなと思った時のパスワード変更APIの例が見つからなかったので
調べて実装したものを書いておく

serializerにちょっと変更を加えることになる
対象はdjango.contrib.auth.modelsのAbustrctUserかそれを継承したクラス
書き込み限定と必須では無い設定を追加する

from rest_framework import serializers  
from django.contrib.auth.models import AbstractUser as User  

class UserSerializer(serializers.ModelSerializer):  

    class Meta:  
        model = User  
        fields = ('id', 'username', 'password')  
        extra_kwargs = {'password': {'write_only':True, 'required':False}}  

書き込み限定を入れないとGETリクエストしたときにGET出来てしまう(パスワードがgetできるのはさすがに・・・)

ハッシュ化されたパスワードの更新にはUserの持っている関数のset_password()を利用する

    # 上の続き  
    def update(self, instance, validated_data):  
        serializers.raise_errors_on_nested_writes('update', self, validated_data)  
        info = serializers.model_meta.get_field_info(instance)  

        m2m_fields = []  
        for attr, value in validated_data.items():  
            if attr in info.relations and info.relations[attr].to_many:  
                m2m_fields.append((attr, value))  
            else:  
                setattr(instance, attr, value)  

        # ココ追記  
        if 'password' in validated_data :  
            instance.set_password(validated_data.get('password'))  
        # ここまで  

        instance.save()  

        for attr, value in m2m_fields:  
            field = getattr(instance, attr)  
            field.set(value)  

        return instance  

instanceを.save()で更新する前にvalidate済みデータの中にpasswordがあるならそれをハッシュ化してinstanceに加える

これでPOSTリクエストから他のUser情報と一緒にパスワードの変更もできちゃう(出来ていいのかは別として)
パスワード変更はメール送信と専用の変更画面などの方法が正しいとは思っている。
けど、どうしても面倒な時(ユーザ管理機能はどうでもいい時。そんな時あるのか?…)にでも使えばいいと思う

参考

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@extra_orderの技術ブログ 最近はPythonばかり書いてるのでPythonの記事が多くなりそう。 アイコンの画像何にしよう。

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう