ByteNoteByteNote
登录按钮用的客户端还没建出来
字

字节笔记本

2026年10月7日 · 约 2 分钟读完

登录按钮用的客户端还没建出来

API中转
¥120

函数是 signInWithGithub。里面 await supabase.auth.signInWithOAuth,provider 为 github。supabase 在这几行里没有赋值,也没有从创建函数返回。页面执行到 supabase.auth 时,这个名字还不存在。

创建函数用的是另一把密钥

用户说应该给出创建客户端的方法。给出的文件从 @supabase/supabase-js 引入 createClient。地址读公开的环境变量,密钥读的是服务端那一把。缺一就抛错。返回的客户端把 autoRefreshToken 和 persistSession 都设为假。这个客户端不会把登录会话留在浏览器里。服务端密钥也不该进到按钮所在的页面。按钮上的 signInWithOAuth 要的是浏览器里那个客户端:它知道地址和公开密钥,并且允许把会话留下来。

两段代码名字都像客户端,职责不同。把服务端那个返回值交给按钮,授权即使跳出去,会话也不会按浏览器这份配置留下。函数里连这个返回值都没有接到 supabase 上。

登录函数调用了 supabase.auth,同页并没有创建它

用户先指出服务器工具那条路径没有给出。创建函数补上之后,登录函数仍直接写 supabase。路径对上了,调用点还是没有把创建结果接进来。环境变量缺了会在创建时抛错,不会变成一个空的 supabase 再去点 .auth。所以按钮上的错误是名字未定义,和密钥缺失是先后两件事。

会话开关和按钮不匹配

persistSession: false 写在服务端这份上是合理的,请求结束不必保存会话。同一份若被按钮拿去调用 signInWithOAuth,登录状态没有地方留下。公开密钥那份才和按钮放在一起,并且不要把服务端密钥写进页面。

服务端客户端关掉了会话保持,按钮却要走授权登录

按钮里的 supabase 必须是创建函数的返回值,而且是浏览器这份。服务端密钥和关掉会话的那份,不要接到 signInWithOAuth 上。

相关文章

分享: