You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js 13.4+Supabase Auth重置密码后刷新自动登录问题求助

问题:Next.js 13.4 + Supabase Auth 密码重置刷新后自动登录

我使用Next.js 13.4和Supabase Auth开发密码重置流程时遇到问题:用户点击邮件中的密码重置链接后,刷新页面会触发自动登录。预期行为是用户必须完成密码重置操作后才能登录,当前不刷新页面时功能正常。

在Supabase社区看到一种解决方案:密码更新表单应放在已登录区域而非认证区域,因为用户需登录才能修改密码。


相关代码

1. 包含登录、注册、密码重置页面的layout.js

import { createServerComponentSupabaseClient } from '@supabase/auth-helpers-nextjs'
import { headers, cookies } from 'next/headers'
import { redirect } from 'next/navigation'

export default async function AuthLayout({ children }) {
    const supabase = createServerComponentSupabaseClient({
        headers,
        cookies,
    })
    const { data } = await supabase.auth.getSession()

    if (data.session) {
        redirect('/admin')
    } // 这行代码导致了问题,但我不能删除它

    return children
}

2. <SupabaseProvider>代码

'use client'

import { createContext, useContext, useEffect, useState } from 'react'
import { createBrowserSupabaseClient } from '@supabase/auth-helpers-nextjs'
import { useRouter } from 'next/navigation'

const Context = createContext(undefined)

export default function SupabaseProvider({ children }) {
    const [supabase] = useState(() => createBrowserSupabaseClient())
    const router = useRouter()

    useEffect(() => {
        const {
            data: { subscription },
        } = supabase.auth.onAuthStateChange((event, session) => {
            console.log("EVENT (provider) => ", event)

            if (event === 'PASSWORD_RECOVERY') {
                router.push('/admin/auth/reset')
            }

            if (session && (event === 'SIGNED_IN' || event == 'TOKEN_REFRESHED')) {
                router.refresh()
            }

            if (event === 'SIGNED_OUT') {
                router.refresh()
            }

        })

        return () => {
            subscription.unsubscribe()
        }
    }, [router, supabase])

    return (
        <Context.Provider value={{ supabase }}>
            <> {children} </>
        </Context.Provider>
    )
}

export const useSupabase = () => {
    const context = useContext(Context)

    if (context === undefined) {
        throw new Error('useSupabase must be used inside SupabaseProvider')
    }

    return context
}

控制台输出(点击重置链接后刷新页面触发自动登录时)

EVENT (provider) => INITIAL_SESSION
EVENT (provider) => PASSWORD_RECOVERY

参考文档

  • Supabase 监听认证事件
  • Supabase 发送密码重置请求

内容的提问来源于stack exchange,提问作者Emre

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 09:27:40