Westagram #3


ログインエンドポイント


ログインビューの作成

  • Instagramに会員登録する場合は、電話番号、ユーザー名、Eメールなどのユーザーアカウントが必要です.
  • Instagramにログインするにはパスワードが必要です.
  • アカウントまたは暗号鍵が送信されていない場合、{"メッセージ":"KEY ERROR"}は、ステータスコード400に戻る.
  • アカウントが存在しない場合、またはパスワードが正しくない場合、{"メッセージ":"INVALID USER"}は、ステータスコード401に戻る.
  • ログインに成功すると{"メッセージ":"SUCCESS"}ステータスコード200に戻る.
  • ログインクラスの作成

    class UserSignInView(View):		# View 클래스를 상속하는 UserSignUpView 클래스 생성
      def post(self, request):		# post 메소드 사용
    ログイン時のgetメソッドとpostメソッド?
    初めてログインビューを作成するときにgetメソッドを使用するかpostメソッドを使用するかを考慮しました.情報を取得する必要があるので(?)getメソッドを使用すべきだと思いますが、getメソッドを使用する場合はurlに情報送信リクエストを含めるべきで、セキュリティとして重要なログインリクエスト方式には向いていません.
    Google検索の結果も、セキュリティ上、request bodyに情報を含むpostメソッドが適切であることを示しています.
    https://stackoverflow.com/questions/43965316/for-login-get-or-post

    エラー1


    要求された電子メールアドレスがデータに存在するかどうかを確認します.
    メールアドレスが存在する場合
    1▼▼▼▼登録を試みたユーザの情報で電子メールアドレスのデータを格納する.
    2▼▼登録に必要なパスワードも確認する.
    存在しないエラーを返します.
    if Account.objects.filter(email=email).exists():	# 저장된 이메일 주소가 존재하는 경우
      login_user = Account.objects.get(email=email)		# login_user에 해당 user 데이터 저장
      .
      .
      .
    return JsonResponse({'MESSAGE': 'INVALID_USER'}, status=401)

    エラー2


    メールアドレス(ユーザー)が存在することを確認し、パスワードが正しいかどうかを確認します.このプロセスでは、暗号化に使用されるbcryptに遭遇します.
    まずbcryptをインストールし、importも提供しました.
    pip install bcrypt	# 설치
    
    import bcrypt		# import하기
    bcryptの暗号化方法
    bcryptはstrデータを暗号化し、bytesデータではない.したがって、暗号化にはbytesの暗号化が必要となる.
    Pythonにあります.
    encode : str -> bytesdecode : bytes -> strEncode、decodeでは「utf-8」Unicode文字仕様を使用して、私たちが認識できる形式に変換します.
    dbに暗号化された形式でパスワードを保存するため、会員が加入する場合は以下のようにパスワードを作成してください.
    password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
    dbにパスワードを記憶する際に符号化されたパスワードを再復号するというプロセスを経て、
    encode()->b'$2b$12$cnQdYm24fHIfbcL1pJRTBOKx6HN1QFZ7QiX6sb08VAjDZEWYMuz0G'encode().decode()->$2b$12$cnQdYm24fHIfbcL1pJRTBOKx6HN1QFZ7QiX6sb08VAjDZEWYMuz0Gは、ストレージを確認できます.
    if  bcrypt.checkpw(password.encode('utf-8'), login_user.password.encode('utf-8')):
    # 요청받은 패스워드를 암호화한 것과 db에 저장되어 있던 패스워드 비교
    
      access_token=jwt.encode({'id' : login_user.id}, 'secret', algorithm='HS256')
      # 동일하다면 토큰 발행
      
      return JsonResponse({'MESSAGE': 'SUCCESS', 'ACCESS_TOKEN': access_token}, status=200)
      # 성공 메시지, 토큰 정보, 코드 반환
    
    return JsonResponse({'MESSAGE': 'INVALID_PASSWORD', status=401)
    # 동일하지 않을 때 에러메시지 및 코드 반환

    私が出会った間違い


    一番目。TypeError: Unicode-objects must be encoded before checking


    dbに格納されているパスワードを暗号化する手順は、次のとおりです.
    password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
    で問題なく入ったと思い、ログインしてみました.
    bcrypt.checkpw(password.encode('utf-8'), login_user.password)
    .
    .
    .

    エラー解決法を探す過程でstackoverflowで同じ問題を迎える文章を発見し,以下の方法の中で最も簡単な方法を用いた.
    https://stackoverflow.com/questions/40577867/bcrypt-checkpw-returns-typeerror-unicode-objects-must-be-encoded-before-checkin

    そして次のミスを迎えました.

    2番目。ValueError : Invalid salt


    パスワードをdbに保存した場合、復号化の原因はこのエラーに遭遇したことです.
    decodeの後のパスワード資料タイプを見るとstr型なのでcheckpwで再符号化するのでしょうか......?と思います.
    ✅ bcrypt.checkpw(入力したパスワード、保存した暗号化パスワード)メソッドのルール
    =>2つのデータ型はBytesでなければなりません.

    完了



    + urls.変更



    ログイン用のUserSignInViewと会員登録用のUserSignUpViewをインポートします.urlpatternsで、実行するタスクとアクセスするクラスを明確にするパスを指定します.
    회원가입
    http POST 127.0.0.1:8000/user/SignUp email='이메일주소' password='패스워드'
    
    로그인
    http POST 127.0.0.1:8000/user/SignIn email='이메일주소' password='패스워드'
    as_view()
    As view()は、UserSignUpViewクラスとUserSignInViewクラスの両方が持つ方法である.
    では、この2つのクラスはどのようにas viewメソッドを持っているのでしょうか.


    views.pyにインポートされたViewから継承されます.
    🔆 as view()ロール=>getリクエスト発行時にget関数を実行し、postリクエスト発行時にpost関数を実行します.