认证

使用Web3登录

通过Supabase利用您的Web3钱包进行用户认证


启用 Web3 登录功能,允许用户仅使用他们的Web3钱包登录您的应用。

支持的Web3钱包:

  • 所有Solana钱包
  • 即将支持:所有以太坊钱包

工作原理

Web3登录采用EIP 4361标准对链下钱包地址进行认证。该标准被Solana生态系统采用,与以太坊版本存在细微差异。

认证流程是要求Web3钱包应用使用用户钱包对预定义消息进行签名。在创建用户账户或会话之前,Web3钱包应用和Supabase Auth都会解析此消息以验证其有效性和用途。

Web3钱包应用使用消息中包含的信息向用户显示确认对话框,询问是否允许通过您的项目进行登录。

并非所有Web3钱包应用都会为这些登录消息显示专门的确认对话框。在这种情况下,Web3钱包会显示传统的消息签名确认对话框。

潜在滥用风险

通过 Web3 钱包登录的用户账户不会关联电子邮件地址或电话号码。这可能导致您的项目面临滥用风险,因为创建 Web3 钱包账户是免费且易于自动化的,同时难以与真实个人身份关联。

通过以下配置控制项目风险:

许多钱包应用会警告用户,如果用于签名的消息不是来自他们当前访问的页面。为了进一步防止您的 Supabase 项目接收到本应发送给其他应用的签名消息,您必须使用重定向 URL 设置注册您的应用 URL。

例如,如果用户正在登录页面 https://example.com/sign-in,您应在重定向 URL 设置中添加以下配置:

  • https://example.com/sign-in/(末尾斜杠很重要)
  • 或者设置全局模式如 https://example.com/**

以太坊钱包登录

以太坊钱包登录功能即将推出。

使用 Solana 登录

大多数 Solana 钱包应用通过网页应用中的 window.solana 全局对象暴露其 API。

Supabase 的 JavaScript 客户端库内置了对该 API 的支持。

要登录用户,请确保:

  1. 用户已安装钱包应用(通过检查 window.solana 对象是否已定义)
  2. 钱包应用已通过 window.solana.connect() API 连接到您的应用

使用以下代码进行用户认证:

1
2
3
4
const { data, error } = await supabase.auth.signInWithWeb3({ chain: 'solana', statement: '我接受服务条款 https://example.com/tos',})

对于大多数 Solana 钱包,必须提供 statement 参数,该消息将显示在用户的授权对话框中,并会添加到用户的身份数据中。

如果您使用的非标准 Solana 钱包未注册 window.solana 对象,或者用户页面附加了多个 Solana 钱包,可以通过如下方式指定钱包对象来消除歧义:

  • 使用 Brave Wallet with Solana:
    1
    2
    3
    4
    5
    const { data, error } = await supabase.auth.signInWithWeb3({ chain: 'solana', statement: '我接受服务条款 https://example.com/tos', wallet: window.braveSolana,})
  • 使用 Phantom with Solana:
    1
    2
    3
    4
    5
    const { data, error } = await supabase.auth.signInWithWeb3({ chain: 'solana', statement: '我接受服务条款 https://example.com/tos', wallet: window.phantom,})

常见问题

如何为使用 Web3 登录的用户关联电子邮件地址、电话号码或社交登录?

Web3 钱包除了钱包地址(公钥)外,不会暴露用户的任何身份信息。这就是为什么通过 Web3 登录创建的账户没有关联任何电子邮件地址或电话号码。

要为账户关联电子邮件地址、电话号码或其他社交登录方式,您可以使用 supabase.auth.updateUser()supabase.auth.linkIdentity() API。