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

supabase_flutter 1.x移除setAuth后,Flutter如何使用自定义JWT?

在supabase_flutter 1.x中使用Firebase生成的自定义JWT认证

supabase_flutter 1.x版本移除了setAuth方法,替代方案有两种,都是官方支持的认证方式:

方法1:使用signInWithCustomToken(推荐)

这是官方推荐的自定义JWT登录方式,会自动处理Session的维护和刷新(如果有可用的refresh token)。

代码示例:

import 'package:supabase_flutter/supabase_flutter.dart';
import 'package:firebase_auth/firebase_auth.dart';

Future<void> authenticateSupabaseWithFirebaseSms() async {
  // 先确保Firebase SMS认证已完成,拿到当前用户
  final firebaseUser = FirebaseAuth.instance.currentUser;
  if (firebaseUser == null) {
    // 处理用户未通过Firebase认证的情况
    return;
  }

  // 获取Firebase生成的idToken(即我们要用到的自定义JWT)
  final firebaseJwt = await firebaseUser.getIdToken();

  try {
    // 调用Supabase的自定义token登录方法
    await Supabase.instance.client.auth.signInWithCustomToken(
      token: firebaseJwt,
    );
    print("Supabase认证成功,已使用Firebase JWT");
  } catch (e) {
    print("Supabase认证失败: $e");
    // 根据错误类型处理,比如token无效、权限不足等
  }
}

方法2:手动构建并设置Session

如果需要更精细的控制Session的内容(比如自定义用户元数据、过期时间),可以手动创建Session对象后调用setSession方法。

代码示例:

import 'package:supabase_flutter/supabase_flutter.dart';
import 'package:firebase_auth/firebase_auth.dart';

Future<void> setSupabaseSessionManually() async {
  final firebaseUser = FirebaseAuth.instance.currentUser;
  if (firebaseUser == null) return;

  final firebaseJwt = await firebaseUser.getIdToken();
  // 从Firebase token的payload中解析过期时间
  final tokenPayload = await firebaseUser.getIdTokenResult();
  final expiresAt = tokenPayload.expirationTime;

  // 构建Supabase Session对象
  final session = Session(
    accessToken: firebaseJwt,
    refreshToken: null, // 如果Firebase提供refresh token可填入
    expiresAt: expiresAt,
    user: User(
      id: firebaseUser.uid,
      email: firebaseUser.email,
      userMetadata: {
        'phone': firebaseUser.phoneNumber,
        // 可以添加其他从Firebase获取的用户信息
      },
      appMetadata: {},
    ),
  );

  try {
    await Supabase.instance.client.auth.setSession(session);
    print("手动设置Supabase Session成功");
  } catch (e) {
    print("设置Session失败: $e");
  }
}

关键注意事项

  • 必须在Supabase控制台配置自定义JWT支持:进入Authentication > Settings > JWT Settings,确保允许外部JWT issuer(Firebase的issuer通常是https://securetoken.google.com/[你的Firebase项目ID]),并验证JWT的签名密钥。
  • 检查Firebase JWT的payload:确保aud(受众)包含你的Supabase项目URL,或者在Supabase中配置允许该JWT的受众。
  • 如果遇到认证错误,优先用JWT解析工具查看token的payload和签名是否符合Supabase的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 22:10:30