Westagram #3
ログインエンドポイント
ログインビューの作成
ログインクラスの作成
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
-> bytes
decode : bytes
-> str
Encode、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関数を実行します.
Reference
この問題について(Westagram #3), 我々は、より多くの情報をここで見つけました https://velog.io/@rin0702/Westagram-3テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol