Supabase,在网站上确认帐户后如何在手机上获取会话

问题描述 投票:0回答:1

我有以下场景。

  1. 用户在移动应用程序上创建帐户并登陆移动应用程序上的

    /confirm
    屏幕。

  2. 用户通过在计算机上单击电子邮件中的确认链接来确认创建的帐户,将他们带到网站而不是移动应用程序。

网站已成功验证用户:

const { data, error } = await supabase.auth.verifyOtp({
  token_hash: token,
  type: "signup",
});

网站告诉用户返回移动应用程序。

  1. 在移动端(在
    /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)
  }, [])

我的理由是:现在帐户已在网站上得到确认,会话也应该在移动应用程序中“可获取”。

但是,这行不通。

如何在移动设备上获取会话(在网站上确认帐户后),以便我可以将用户重定向到移动应用程序的登录部分?

react-native authentication expo supabase supabase-js
1个回答
0
投票

根据 Supabase 文档,对于此类用例(服务器端验证),您不应依赖

getSession
,因为未编码的会话数据是从本地存储介质检索的。

这意味着

getSession
在您的用例中将始终为空,因为您没有通过电子邮件验证创建会话。

Supabase 通过 URL 发送所有数据(当您单击确认电子邮件按钮时)以创建会话。在这里,您首先需要验证用户是否在服务器端获得授权。

要检查用户是否已获得授权(服务器端),您需要使用:

const { data: { user } } = await supabase.auth.getUser();

因为它在服务器上验证用户的访问令牌 JWT。

此请求将向您发送已登录用户的所有身份验证元数据,例如

confirmed_at: 'DATE OF EMAIL CONFIRMATION', role: authenticated

© www.soinside.com 2019 - 2024. All rights reserved.