Django-ログインビュー


ログイン
<ログインフロー>
1)ユーザーログイン→ユーザー名とパスワードの入力
2)ユーザーが入力したパスワードを暗号化した後、暗号化したユーザーパスワードとデータベースに保存したユーザーパスワードを比較する
3)一致した場合、ログインに成功
4)ログインに成功したら、アクセスtockenをクライアントに送信
5)ユーザログインに成功した後,次回はアクセスtokenを添付し,毎回ログインしないようにサーバに要求を送信する.
class LoginView(View):
    def post(self, request):
        try:
            data = json.loads(request.body)

            email = data.get('email')
            nickname = data.get('nickname')
            phone_number = data.get('phone_number')

            if email or nickname or phone_number:
                if not User.objects.filter(Q(email=email) | Q(nickname=nickname) | Q(phone_number=phone_number)).exists():
                    return JsonResponse({'MESSAGE': 'NOT FOUND'}, status=404)  
                passwords = User.objects.get(email=data['email']).password

            if bcrypt.checkpw(data['password'].encode('utf-8'),passwords.encode('utf-8')):
             
                access_token = jwt.encode({'id': User.objects.get(email=email).id}, SECRET['secret'], algorithm='HS256')
                return JsonResponse({'MESSGAGE': access_token}, status=200)
            else:
                return JsonResponse({'MESSAGE': 'NOT FOUND'}, status=404)

        except KeyError:
            return JsonResponse({'MESSAGE': 'KEY_ERROR'}, status=400)
💡 ログイン
ログイン時にはメール、ニックネーム、phone numberを1つ入力するだけでログインできます.でも単純なif email = ''という価格はいらない!そうすると、keyerrorの問題が出てきたので、苦労をたくさんしました.dict.get("key")を使えばいいと後で知りました.
email = data.get('email')
nickname = data.get('nickname')
phone_number = data.get('phone_number')
このようにしてデータを受信すると、データがなければNoneに直接アクセスするのでkeyerrorエラーを解決することができる.
💡 コイン発行
フロントと通信するときは、メールを入力するだけでログインでき、コードを書くことができ、メールは同じ人のidをもたらすと思います.また、secret keyも他のファイルでsecret keyをdickshnery形式と宣言してインポートして使用するため、SECRET['secret']で書き込みが行われた.
secret keyは、トークンの発行を符号化する際に、そのトークンを再復号する際のsecret keyと同じでなければならない.
Review

  • .filter()
    クエリー・セットとしてインポートします.
    filter(name=「サポート」)<サポートという名前の子供だけをインポート...!>
    nameはデータベースのカラム名です!!
    =>データを取得するには、無条件クエリー(object)に変換する必要があります.

  • email = data.get('email')
    キーがあればインポートし、キーがなければdefault値をインポートします(default値を無条件に入力->キーがなければdefault値をインポートします).

  • email = data['email']
    キーパーソンemailのvalueが必要です
    keyがない場合、eamil変数の値は正しくありません.(KEYERROR)
    ログイン時、ニックネーム、email、phone numberのいずれかが入ってきたら、ログインする必要があります.
    data.get(「email」)はデフォルト値でも構いませんが、data[「email」はemailというキーがない場合、値は入力されないためkeyerrorが発生します.

  • コイン枚
    バックエンドの立場では,トークンはどのユーザ情報を送信すべきかを知るために必要である.
    たとえば、バックエンドでは、どのユーザーがログインしているか分かりません.だからtokenを通じてどのプレイヤーにショッピングバスケットを見せて、私のページを見せるかを知ることができます.
    フロントはリクエストごとにコインを送信します.(ログインが必要な場合)
    フロントはコインをローカルメモリに入れます.

  • elseが少なめのチラシがダメな場合は、先に考えるともっと簡単です.

  • jwtを使用してトークンを発行する方法
  • import jwt #패키지명은 pyjwt이지만 임포트할때의 이름은 jwt입니다.
    
    SECRET = 'secret' #'랜덤한 조합의 키' 예제이므로 단순하게 'secret'이라고 하겠습니다.
    
    token = jwt.encode({'id': User.objects.get(email=email).id}, SECRET, algorithm='HS256')
    print(access_token)
    'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MX0.-xXA0iKB4mVNvWLYFtt2xNiYkFpObF54J9lj2RwduAI'
    
    header = jwt.decode(access_token, SECRET, algorithm = 'HS256')
    print(header)
    {'id': 1}
    ユーザは、バックエンドに読み込まれたタイトル値で識別できます.
    フロントはユーザの情報をheadersに入れてrequestを送信する.
    バックエンドは、最初にトークンを作成およびログインするときに一度だけ送信され、フロントは常にhttpのヘッダにトークンを追加してバックエンドを要求します.また、バックエンドは、タグに基づいてユーザが誰であるかを判断することができる.
    これを認証するコードは、レコーダによって実現される.
  • フロントとの通信時に使用するサーバアドレス
    ->0.0.0.0:8000 ipアドレス
    ->ipconfig getifiaddr en 0:自分のipアドレスを知る
    =>フロントアドレスを教えるときは、というようにipアドレスと一緒に伝えるべきです.
    フロントと通信する場合は、同じWiFiに接続する必要があります.