Firebase无密码邮箱链接登录报错400 OPERATION_NOT_ALLOWED求助
问题描述
已在Firebase项目中配置无密码邮箱登录,按文档实现功能后,调用sendSignInLinkToEmail接口时始终返回OPERATION_NOT_ALLOWED错误。相关代码、请求及错误信息如下:
实现代码
const actionCodeSettings = { url: "https://acme.com", handleCodeInApp: true, dynamicLinkDomain: "acme.com", }; const response = await firebase.auth().sendSignInLinkToEmail(email, actionCodeSettings);
接口请求
curl 'https://identitytoolkit.googleapis.com/v1/accounts:sendOobCode?key=XXX' \ ... --data-raw '{"requestType":"EMAIL_SIGNIN","email":"mugen@acme.co","continueUrl":"https://acme.co","canHandleCodeInApp":true,dynamicLinkDomain:"acme.com"}'
返回错误
{ "error": { "code": 400, "message": "OPERATION_NOT_ALLOWED", "errors": [ { "message": "OPERATION_NOT_ALLOWED", "domain": "global", "reason": "invalid" } ] } }
注:域名已加入Firebase授权列表,尝试过携带/不携带dynamicLinkDomain参数,问题未解决。
排查与解决步骤
确认无密码登录开关状态
进入Firebase控制台 → 认证 → 登录方法,检查「邮箱链接(无密码登录)」是否启用。注意配置后务必点击保存,避免页面刷新导致状态未同步。校验API密钥有效性
确保请求中的API密钥属于当前Firebase项目,且在Google Cloud控制台的API密钥页面中,该密钥已启用「Identity Toolkit API」权限,无额外限制导致接口调用被拦截。统一continueUrl与配置域名
代码中actionCodeSettings.url为https://acme.com,但请求里的continueUrl是https://acme.co,二者域名不一致。Firebase要求continueUrl必须与授权域名完全匹配,同时代码与请求中的地址需保持统一,修正为相同的合法域名。检查动态链接域名配置
若使用dynamicLinkDomain,需确认该域名已在Firebase控制台「动态链接」模块完成配置并验证所有权。即使不携带该参数,也要清理项目中无效的动态链接配置,避免冲突。测试其他邮箱地址
当前测试邮箱mugen@acme.co可能因多次失败请求被标记为异常,换用其他有效邮箱重试,排查是否为账号层面的限制。
内容的提问来源于stack exchange,提问作者Mugen

