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

Android端Expo项目Firebase Magic Link登录链接不完整问题求助

解决方案:Expo托管工作流中Firebase魔法链接仅获取continueURL的问题

核心问题原因

安卓端Expo的动态链接处理会自动提取continueURL作为跳转目标,但Firebase魔法链接需要包含oobCode等验证参数的完整链接,才能通过isSignInWithEmailLink()校验,这是导致验证失败的关键。

具体修复步骤

1. 修正app.json的Intent过滤配置

在app.json的expo.android.intentFilters中,确保配置能捕获完整的Firebase动态链接路径,不要仅匹配continueURL:

{
  "expo": {
    "android": {
      "intentFilters": [
        {
          "action": "VIEW",
          "data": [
            {
              "scheme": "你的App自定义scheme",
              "host": "你的Firebase动态链接域名(如xxx.page.link)",
              "pathPrefix": "/"
            }
          ],
          "category": ["BROWSABLE", "DEFAULT"]
        }
      ]
    }
  }
}

关键是将pathPrefix设为/,确保捕获链接的完整路径参数,避免仅截取到continueURL部分。

2. 调整链接监听逻辑,提取完整魔法链接

使用expo-linking时,不要直接使用返回的url,而是从Intent原始数据中解析完整链接:

import * as Linking from 'expo-linking';
import { getAuth, isSignInWithEmailLink, signInWithEmailLink } from 'firebase/auth';

const auth = getAuth();
const userEmail = '用户预输入的邮箱'; // 需提前存储用户邮箱

// 处理App启动时的初始链接
const handleInitialLink = async () => {
  const initialUrl = await Linking.getInitialURL();
  if (!initialUrl) return;

  // 尝试解析Intent中的原始完整链接
  const intentData = await Linking.parseIntentUrl(initialUrl);
  const fullMagicLink = intentData?.url || initialUrl;

  if (isSignInWithEmailLink(auth, fullMagicLink)) {
    await signInWithEmailLink(auth, userEmail, fullMagicLink);
  }
};

// 监听App运行中的链接唤起
Linking.addEventListener('url', async (event) => {
  const intentData = await Linking.parseIntentUrl(event.url);
  const fullMagicLink = intentData?.url || event.url;

  if (isSignInWithEmailLink(auth, fullMagicLink)) {
    await signInWithEmailLink(auth, userEmail, fullMagicLink);
  }
});

3. 规范Firebase魔法链接的参数配置

调用sendSignInLinkToEmail()时,确保actionCodeSettings的url和App配置的scheme一致:

const actionCodeSettings = {
  url: '你的App自定义scheme://login', // 需与app.json中的scheme匹配
  handleCodeInApp: true,
  android: {
    packageName: '你的安卓包名',
    installApp: true
  }
};

await sendSignInLinkToEmail(auth, userEmail, actionCodeSettings);

4. 测试注意事项

  • 必须使用expo-dev-client构建的开发包测试,Expo Go会自动处理链接导致参数丢失
  • 直接在设备自带邮件App中点击链接,避免第三方浏览器中转截断参数

内容的提问来源于stack exchange,提问作者Gabor wraight

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 04:45:43