본문 바로가기

TIL

TIL - supabase 비밀번호 재설정 트러블 슈팅

문제

비밀번호 재설정 이메일의 URL로 접근 시, 일회성 토큰이 제대로 인식되지 않는 문제가 발생했습니다.

원인

일회성 토큰이 유효한 인증 세션으로 자동 변환되지 않았기 때문입니다.

해결 방법

이 문제를 해결하기 위해 supabase.auth.exchangeCodeForSession() 메서드를 사용하여 일회성 토큰을 유효한 인증 세션으로 교환했습니다.

 

import { createClient } from '@/supabase/server';
import { NextRequest, NextResponse } from 'next/server';

export async function POST(request: NextRequest) {
  const { newPassword, token } = await request.json();

  const supabase = createClient();

  try {
    await supabase.auth.exchangeCodeForSession(token);

    const { error } = await supabase.auth.updateUser({ password: newPassword });

    if (error) {
      console.error('Password update error:', error);
      return NextResponse.json({ error: error.message }, { status: 400 });
    }

    return NextResponse.json({ message: 'The password has been successfully changed.' }, { status: 200 });
  } catch (error) {
    console.error('Unexpected error:', error);
    return NextResponse.json({ error: 'An unexpected error occurred, please try again.' }, { status: 500 });
  }
}

이와 같은 방식으로 supabase.auth.exchangeCodeForSession()을 사용하여 비밀번호 재설정 프로세스를 개선할 수 있었습니다.

 

결과

이제 사용자는 비밀번호 재설정 이메일에 포함된 URL을 통해 접속하여 일회성 토큰을 유효한 인증 세션으로 교환하고, 비밀번호를 성공적으로 변경할 수 있습니다.