Spring Boot集成Firebase Admin SDK生成邮件验证链接报错排查
问题描述
我正在使用Spring Boot和Firebase Auth Admin SDK构建Rest API,通过以下方法在Firebase中创建用户:
@Override public UserRecord createFirebaseUser(SignupRequest signupRequest) throws FirebaseAuthException { UserRecord user = FirebaseAuth.getInstance().createUser(new UserRecord.CreateRequest() .setEmail(signupRequest.getEmail()) .setDisplayName(signupRequest.getUsername()) .setPassword(signupRequest.getPassword()) .setEmailVerified(false) .setDisabled(false)); generateVerificationLink(user.getUid()); return user; } @Override public String generateVerificationLink(String firebaseId) throws FirebaseAuthException { UserRecord firebaseUser = FirebaseAuth.getInstance().getUser(firebaseId); return FirebaseAuth.getInstance().generateEmailVerificationLink(firebaseUser.getEmail()); }
调用该方法时返回如下错误响应:
com.google.firebase.auth.FirebaseAuthException: Unexpected HTTP response with status: 400 { "error": { "code": 400, "message": "TOO_MANY_ATTEMPTS_TRY_LATER", "errors": [ { "message": "TOO_MANY_ATTEMPTS_TRY_LATER", "domain": "global", "reason": "invalid" } ] } }
每个用户仅发送一次请求,却始终遇到该错误,请问需要如何修复?
修复方案
1. 优化API调用减少请求次数
当前generateVerificationLink方法中,先调用getUser(firebaseId)获取用户信息再生成验证链接是多余的。创建用户时已经拿到完整的UserRecord,直接传递该对象即可避免额外API请求:
@Override public UserRecord createFirebaseUser(SignupRequest signupRequest) throws FirebaseAuthException { UserRecord user = FirebaseAuth.getInstance().createUser(new UserRecord.CreateRequest() .setEmail(signupRequest.getEmail()) .setDisplayName(signupRequest.getUsername()) .setPassword(signupRequest.getPassword()) .setEmailVerified(false) .setDisabled(false)); generateVerificationLink(user); // 直接传递UserRecord return user; } @Override public String generateVerificationLink(UserRecord firebaseUser) throws FirebaseAuthException { return FirebaseAuth.getInstance().generateEmailVerificationLink(firebaseUser.getEmail()); }
每创建一个用户减少一次API请求,降低触发速率限制的概率。
2. 检查Firebase速率限制阈值
Firebase Auth对Admin SDK有默认速率限制,即使单用户单次请求,若服务器IP短时间内发起大量请求(比如测试阶段重复调用),会触发全局限制。可以在Firebase控制台的Authentication > 设置 > 限制页面查看当前阈值,确认是否触发了拦截。
3. 排查隐性重复请求
确认后端是否存在框架层面的重试机制、负载均衡重复转发等隐性重复请求。可以给每个请求添加唯一标识并记录日志,排查是否有重复调用的情况。
4. 确认Admin SDK初始化正确性
检查服务账号密钥是否正确加载,初始化代码是否关联了正确的Firebase项目,错误的配置可能导致请求被异常拦截,表现为速率限制错误:
// 示例正确初始化代码 FileInputStream serviceAccount = new FileInputStream("path/to/serviceAccountKey.json"); FirebaseOptions options = new FirebaseOptions.Builder() .setCredentials(GoogleCredentials.fromStream(serviceAccount)) .setDatabaseUrl("https://your-project-id.firebaseio.com") .build(); FirebaseApp.initializeApp(options);
5. 申请调整Firebase限制
如果业务请求量在合理范围内但仍触发限制,可通过Firebase控制台的支持渠道提交申请,请求调整Auth API的速率限制阈值。
内容的提问来源于stack exchange,提问作者Apri
相关产品推荐
相关产品推荐

