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

如何在Deno框架中使用Firebase实现signInWithEmail并替换Node.js依赖

在Deno中解决Firebase邮箱登录的Node.js依赖兼容问题

方案一:启用Deno Node兼容层并替换专属API

Deno提供了Node.js兼容模式,可缓解部分依赖问题,同时需要手动替换Node专属API:

  • 启动Deno时添加--compat标志,同时授予必要权限(--allow-env、--allow-net等)
  • 替换node:process相关逻辑:用Deno.env.get()替代process.env获取环境变量
  • 替换node:buffer相关逻辑:用Uint8Array替代Buffer,配合TextDecoder/TextEncoder处理编码转换

示例代码片段:

// 获取Firebase API密钥
const firebaseApiKey = Deno.env.get("FIREBASE_API_KEY")!;

// 替代Buffer的二进制数据处理
const rawData = new Uint8Array([0x48, 0x65, 0x6c, 0x6c, 0x6f]);
const text = new TextDecoder().decode(rawData); // 转换为字符串

运行命令示例:

deno run --compat --allow-env --allow-net your-auth-script.ts

方案二:直接调用Firebase Authentication REST API(推荐)

绕开Node.js版Firebase SDK的依赖限制,通过HTTP请求直接调用Firebase官方REST接口实现邮箱登录流程,这是Deno环境下最稳定的方案:

1. 发送登录链接到邮箱

调用sendOobCode端点触发邮箱登录链接发送:

async function sendSignInLinkToEmail(email: string, continueUrl: string) {
  const apiKey = Deno.env.get("FIREBASE_API_KEY")!;
  const res = await fetch(
    `https://identitytoolkit.googleapis.com/v1/accounts:sendOobCode?key=${apiKey}`,
    {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({
        requestType: "EMAIL_SIGNIN",
        email,
        continueUrl
      })
    }
  );

  if (!res.ok) {
    const error = await res.json();
    throw new Error(error.error.message);
  }

  return await res.json();
}

2. 通过链接完成登录

从回调URL中提取oobCode参数,调用signInWithEmailLink对应的端点完成认证:

async function signInWithEmailLink(email: string, oobCode: string) {
  const apiKey = Deno.env.get("FIREBASE_API_KEY")!;
  const res = await fetch(
    `https://identitytoolkit.googleapis.com/v1/accounts:signInWithEmailLink?key=${apiKey}`,
    {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({
        email,
        oobCode
      })
    }
  );

  if (!res.ok) {
    const error = await res.json();
    throw new Error(error.error.message);
  }

  const authResult = await res.json();
  // 此处可获取idToken、refreshToken等认证凭证
  return authResult;
}

内容的提问来源于stack exchange,提问作者Fred K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 04:55:12