RytRyu-0817
@RytRyu-0817

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Django新規登録の確認メール時にリクエストが2回重複する

解決したいこと

ユーザの新規登録部分を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回目のリクエストが呼ばれてしまうのでしょうか。

自分で試したこと

キャッシュの削除
リダイレクト先で間違って、リクエストが行われていないかの確認

0

1Answer

コードの断片だけ見せられても、誰も読まないし何も言わないと思います。何度もやり取りなども面倒でしたくないです。ただのキーの確認処理自体が難しいはずはないので、現象をきちんと分解して問題の起こる最小限のコードにした上で必要なコード全てを開示し、ピンポイントで明快に質問しましょう。

きっと調べてるうちに質問する必要がなくなります。

0Like

Comments

  1. @RytRyu-0817

    Questioner

    コメントありがとうございます。
    大変失礼いたしました。回答者様側のことがあまり深く考えられていなかったです。
    再度問題を明確にして、再質問したいと思います。

Your answer might help someone💌