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

如何在Firebase服务器端批量验证500个FCM Token?

批量验证FCM Token的可行方案

FCM Instance ID官方API没有提供直接的批量验证接口,但可以通过以下几种高效方式处理500个Token的验证需求:

1. 并发异步请求

通过控制并发数发起异步请求,避免逐个同步请求的低效问题(建议设置10-20个并发,避免触发Google API的限流机制)。

Python异步脚本示例(使用aiohttp)

import aiohttp
import asyncio

# 替换为你的认证Token和待验证的Token列表
FCM_AUTH_TOKEN = "ya29.ElqKBGN2Ri_Uz...HnS_uNreA"
TOKENS = ["nKctODamlM4:CKrh_PC8kIb7O...clJONHoA", "...", "剩余498个Token"]

async def validate_token(session, token):
    url = f"https://iid.googleapis.com/iid/info/{token}?details=true"
    headers = {
        "Content-Type": "application/json",
        "Authorization": f"Bearer {FCM_AUTH_TOKEN}",
        "access_token_auth": "true"
    }
    try:
        async with session.get(url, headers=headers) as response:
            if response.status == 200:
                return (token, "有效", await response.json())
            elif response.status == 404:
                return (token, "无效", None)
            else:
                return (token, f"错误: {response.status}", None)
    except Exception as e:
        return (token, f"异常: {str(e)}", None)

async def main():
    async with aiohttp.ClientSession() as session:
        tasks = [validate_token(session, token) for token in TOKENS]
        results = await asyncio.gather(*tasks)
        # 将结果写入文件保存
        with open("fcm_token_validation_results.txt", "w") as f:
            for token, status, data in results:
                f.write(f"{token}: {status}\n")

if __name__ == "__main__":
    asyncio.run(main())

命令行并行请求示例(使用xargs+curl)

假设你将所有Token存入tokens.txt(每行一个Token):

cat tokens.txt | xargs -P 10 -I {} curl -s -o /dev/null -w "{}: %{http_code}\n" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA" \
  -H "access_token_auth: true" \
  "https://iid.googleapis.com/iid/info/{}?details=true"

2. 基于Firebase Admin SDK封装批量验证

利用Firebase Admin SDK的自动认证能力,不用手动管理Bearer Token,封装异步验证逻辑:

Python Admin SDK示例

import firebase_admin
from firebase_admin import credentials
import asyncio
import aiohttp

# 初始化Admin SDK(替换为你的服务账号密钥路径)
cred = credentials.Certificate("path/to/serviceAccountKey.json")
firebase_admin.initialize_app(cred)

TOKENS = ["nKctODamlM4:CKrh_PC8kIb7O...clJONHoA", "...", "剩余498个Token"]

async def validate_token(session, token):
    # 通过SDK自动获取有效访问令牌
    access_token = firebase_admin.credentials.ApplicationDefault().get_access_token().access_token
    url = f"https://iid.googleapis.com/iid/info/{token}?details=true"
    headers = {
        "Content-Type": "application/json",
        "Authorization": f"Bearer {access_token}",
        "access_token_auth": "true"
    }
    try:
        async with session.get(url, headers=headers) as response:
            if response.status == 200:
                return (token, "有效")
            elif response.status == 404:
                return (token, "无效")
            else:
                return (token, f"错误: {response.status}")
    except Exception as e:
        return (token, f"异常: {str(e)}")

async def main():
    async with aiohttp.ClientSession() as session:
        tasks = [validate_token(session, token) for token in TOKENS]
        results = await asyncio.gather(*tasks)
        for res in results:
            print(res)

if __name__ == "__main__":
    asyncio.run(main())

关键注意事项

  • 配额与限流:500个请求在FCM API配额范围内,但并发过高会触发429限流,建议严格控制并发数在10-20之间。
  • 错误码解读:404表示Token已无效或被注销;401表示认证失败,需检查Token或SDK配置;429需添加重试机制或降低并发。
  • 结果存储:将验证结果(有效/无效/错误)持久化到文件或数据库,方便后续清理无效Token。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 06:25:56