我有以下场景。
用户在移动应用程序上创建帐户并登陆移动应用程序上的
/confirm
屏幕。
用户通过在计算机上单击电子邮件中的确认链接来确认创建的帐户,将他们带到网站而不是移动应用程序。
网站已成功验证用户:
const { data, error } = await supabase.auth.verifyOtp({
token_hash: token,
type: "signup",
});
网站告诉用户返回移动应用程序。
/confirm
屏幕中),我尝试定期获取会话或用户信息,但我得到了会话和用户的 null
。 useEffect(() => {
const interval = setInterval(async () => {
const { data, error } = await supabase.auth.getSession() // returns null
const {
data: { user },
} = await supabase.auth.getUser() // returns null
if (error) {
captureException(error)
return
}
if (data?.session) {
setAccountConfirmed(true)
clearInterval(interval)
}
}, 3000)
return () => clearInterval(interval)
}, [])
我的理由是:现在帐户已在网站上得到确认,会话也应该在移动应用程序中“可获取”。
但是,这行不通。
如何在移动设备上获取会话(在网站上确认帐户后),以便我可以将用户重定向到移动应用程序的登录部分?
根据 Supabase 文档,对于此类用例(服务器端验证),您不应依赖
getSession
,因为未编码的会话数据是从本地存储介质检索的。
这意味着
getSession
在您的用例中将始终为空,因为您没有通过电子邮件验证创建会话。
Supabase 通过 URL 发送所有数据(当您单击确认电子邮件按钮时)以创建会话。在这里,您首先需要验证用户是否在服务器端获得授权。
要检查用户是否已获得授权(服务器端),您需要使用:
const { data: { user } } = await supabase.auth.getUser();
因为它在服务器上验证用户的访问令牌 JWT。
此请求将向您发送已登录用户的所有身份验证元数据,例如
confirmed_at: 'DATE OF EMAIL CONFIRMATION', role: authenticated