Django新規登録の確認メール時にリクエストが2回重複する
Q&A
Closed
解決したいこと
ユーザの新規登録部分をdj-rest-authで実装しています。
新規登録の項目入力後、メールアドレスに送られる以下のようなurlに対し、getでメールアドレス認証をさせるような仕組みです。
<実際のメール>
登録を続けるには、以下のリンクをクリックしてください。
http://127.0.0.1:8000/auth/account-confirm-email/MTE4:1rcjN8:Tc4BCeRXaHPmT1-iuIydNdKs9AI9an2OWAfHoMvBXk4/
その際上記のurlに対するviewが以下のviewです。
class CustomEmailConfirmView(APIView):
permission_classes = [AllowAny, ]
def get(self, request, key):
frontend_origin = settings.FRONTEND_ORIGIN
verify_email_url = settings.CUSTOM_VERIFY_EMAIL_LINK
# auth/verify-email/にポストして、認証を行う
response = requests.post(verify_email_url, {'key': key})
print(response)
# メアドの認証が完了した際にvue.jsで作ったログインページにリダイレクトさせる
if response.status_code == 200:
login_url = f"{frontend_origin}/login"
return redirect(login_url)
# メアドの認証が完了しなかったらサインアップページにリダイレクト
else:
signup_url = f"{frontend_origin}/signup"
return redirect(signup_url)
実際にメールに送られた上記のリンクを踏んだ時のバックエンドのログが以下になります
[21/Feb/2024 18:55:28] "POST /auth/verify-email/ HTTP/1.1" 200 15
<Response [200]>
[21/Feb/2024 18:55:28] "GET /auth/account-confirm-email/MTE3:1rcjJt:k2HKI-kyMemdeIPKCm4pwrhXdr6FH0eXgwhn9wqL-uE/ HTTP/1.1" 302 0
Not Found: /auth/verify-email/
↓一回しかリンクを踏んでいないのにもう一度viewが呼ばれてしまう
[21/Feb/2024 18:55:29] "POST /auth/verify-email/ HTTP/1.1" 404 46
<Response [404]>
[21/Feb/2024 18:55:29] "GET /auth/account-confirm-email/MTE3:1rcjJt:k2HKI-kyMemdeIPKCm4pwrhXdr6FH0eXgwhn9wqL-uE/ HTTP/1.1" 302 0
以下がルーティングのパスです
path('signup/', RegisterView.as_view(), name='rest_register'),
path('google/', GoogleLogin.as_view(), name='google_login'),
path('login/', LoginView.as_view(), name='rest_login'),
path('logout/', LogoutView.as_view(), name='rest_logout'),
path('user/', UserDetailsView.as_view(), name='rest_user_details'),
# ↓確認メールに送られてくるリンク
re_path(r'account-confirm-email/(?P<key>[-:\w]+)/$', CustomEmailConfirmView.as_view(),name='account_confirm_email',),
path("account_email_verification_sent", TemplateView.as_view(), name="account_email_verification_sent"),
path('password/reset/', PasswordResetView.as_view(), name='rest_password_reset'),
path('password/reset/confirm/', PasswordResetConfirmView.as_view(), name='rest_password_reset_confirm'),
path('password/change/', PasswordChangeView.as_view(), name='rest_password_change'),
path('verify-email/', VerifyEmailView.as_view(), name='rest_verify_email'),
path('resend-email/', ResendEmailVerificationView.as_view(), name="rest_resend_email"),
発生している問題・エラー
ログを見る限りメールアドレスの認証自体は正常に行われて、ログインページに一度リダイレクトされていると思うのですが、そのあとになぜかもう一度上のviewが呼ばれてしまっています。認証自体は行われているので問題はないのですが、2回目の謎の呼び出しのせいで認証が正常に行われていてもサインアップページに飛んでしまいます(postが404になるから)。
なぜ2回目のリクエストが呼ばれてしまうのでしょうか。
自分で試したこと
キャッシュの削除
リダイレクト先で間違って、リクエストが行われていないかの確認