从Astro到Emdash踩坑记(二)

在上一篇 文章 中,我介绍了怎样使用 Claude Code 协助我们将 Astro 迁移到 EmDash。虽然部署过程丝滑,但文末留下的悬念却是一个真实的险情——当我绑定自定义域名后,Passkey登录失效,而后台又提示没有配置邮件服务。这篇文章就来完整记录这次“脱困”与鉴权修复的全过程。

为什么会被“锁在门外”?

将独立域名解析到 Cloudflare Worker 后,我满心欢喜地打开 https://epona.me/_emdash/admin 准备登录,却发现系统弹不出任何 Passkey 验证。

冷静一想,这是 WebAuthn 的安全设计所致:Passkey 凭据是严格绑定访问域名(Origin / Relying Party ID)的。当初我在 *.workers.dev 临时域名下注册的凭据,在epona.me下自然无法生效。

这时候系统提示可以使用邮箱进行登录, 但尴尬的是——我刚部署完,还没有配置任何的邮件服务。幸好我可以使用 *.workers.dev/_emdash/admin 来登录后台。

给EmDash配置邮件服务

既然已经进入了后台,那么当务之急就是抓紧配置好邮件服务,防止再次被锁死。

插件选型

进入后台Settings → Email , 界面显示: No email provider configured 。这种配置自然交给 Claude Code 来帮忙处理。

image-1788779054099.png

经过一番探索, Claude Code给出了三个选项:

  1. Cloudflare Email Sending:官方原生支持,直接利用 Cloudflare 边缘发信。
  2. Resend:EmDash 官方推荐的第三方插件。
  3. Postmark / AWS SES 等传统 SMTP/API 服务。

考虑到整个博客的技术栈都建立在 Cloudflare 全家桶(Workers + D1 + R2)上,我倾向于尽量少引入外部第三方依赖,因此选择了 Cloudflare Email Sending

注:该功能需要开通 Cloudflare Workers 付费计划($5/月),鉴于价格不贵且后续还会用到其他高级特性,趁机直接付费开通。

插件安装与测试

在 Claude Code 的引导下,我们为 EmDash 安装并启用了邮件插件。部署生效后,EmDash 后台左侧菜单出现了新的 Cloudflare Email 入口。配置好发信地址后,在测试框输入个人邮箱,点击发送——顺利收到了测试邮件!

Screenshot 2026-09-08 at 20.06.58.png

siteUrl的问题

有了邮件服务,我退出了 workers.dev,回到自定义域名 https://epona.me/_emdash/admin 尝试用邮箱登录。这次邮件确实正常发出了,但诡异的是:邮件里的登录跳转链接(Magic Link)居然依然指向 *.workers.dev!由于登录 Token 在验证时并不强校验来源域名,我只能手动复制链接,把开头的域名改成自己的 epona.me 强行登录。

接着,我又让 AI 排查为什么在这个状态下依然无法给自定义域名添加 Passkey。AI 经过分析指出了关键问题:EmDash 的核心配置中缺少了基础站点地址(siteUrl)的显式定义!当没有显式指定 siteUrl 时,EmDash 内部的绝对链接生成逻辑以及 WebAuthn 依赖的 RP ID,都会回退使用 Workers的原始临时域名。我们在项目配置文件中加上:

emdash({
    siteUrl: "https://epona.me",
    // ... 其他配置
})

重新构建并部署后Magic Link地址正确, Passkey也可以成功使用自定义域名绑定了。

总结

回顾这次有惊无险的登录鉴权配置,有两条经验值得和朋友分享:

  1. 配置顺序原则:先定域名,再做鉴权

在部署类似 Cloudflare Workers 的全栈 CMS 时,第一步就应该在配置文件中把自定义域名的 siteUrl写死并绑好域名。千万不要图省事在临时域名下把所有账号、凭据都配完。

  1. 多重登录冗余是刚需

现代 Web 推广无密码(Passkey)登录体验极佳,但由于其强绑定 Origin 的物理特性,容错率较低。上线前务必先打通邮箱服务作为 Fallback兜底手段,否则一旦域名或凭据变动,极易将自己完全关在门外。

Epona
Written byEpona

There's nothing wrong with having a little fun

x.com/simura_epona

1 Comment

  1. Epona
    hello from myself
All posts