如何获取Firebase HTTP V1 Access Token并延长其有效期?
FCM HTTP V1 Access Token 有效期延长及获取方法
问题背景
我目前用Python通过Firebase Admin SDK获取FCM的Access Token,代码如下:
import firebase_admin from firebase_admin import credentials cred = credentials.Certificate("path/to/serviceAccountKey.json") firebase_admin.initialize_app(cred)
代码运行正常,但发现Access Token有效期仅为1天,想知道怎么延长有效期,同时需要获取请求授权头里的Bearer token,示例请求如下:
POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1 Content-Type: application/json Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA { "message":{ "token":"token_1", "data":{}, "notification":{ "title":"FCM Message", "body":"This is an FCM notification message!", } } }
解决方案
首先明确:FCM HTTP V1 API使用的OAuth 2.0 Access Token无法手动延长有效期,Google设定的有效期是1小时(你说的1天应该是误解,Admin SDK自动管理的令牌实际有效期为1小时,到期会自动刷新)。
1. 借助Admin SDK自动管理令牌(推荐)
如果用Firebase Admin SDK发送FCM消息,完全不需要手动处理Token——SDK会自动完成令牌的获取、缓存和到期刷新,直接调用消息发送接口即可:
from firebase_admin import messaging def send_fcm_notification(): # 构造消息 message = messaging.Message( notification=messaging.Notification( title="FCM Message", body="This is an FCM notification message!" ), token="token_1" ) # 发送消息 response = messaging.send(message) print(f"消息发送成功,响应ID: {response}")
这种方式下,你完全不用关心令牌有效期的问题,SDK会帮你搞定一切。
2. 手动生成并刷新令牌(仅需直接调用HTTP API时使用)
如果必须直接调用FCM HTTP V1 API,需要用服务账号密钥生成短期Token,步骤如下:
- 使用
google-auth库生成令牌,有效期最长1小时(Google安全限制,无法延长):
from google.oauth2 import service_account import requests # 加载服务账号密钥 credentials = service_account.Credentials.from_service_account_file( "path/to/serviceAccountKey.json", scopes=["https://www.googleapis.com/auth/firebase.messaging"] ) # 获取或刷新AccessToken if credentials.expired: credentials.refresh(requests.Request()) access_token = credentials.token # 构造请求发送消息 headers = { "Authorization": f"Bearer {access_token}", "Content-Type": "application/json" } payload = { "message": { "token": "token_1", "notification": { "title": "FCM Message", "body": "This is an FCM notification message!" } } } response = requests.post( "https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send", json=payload, headers=headers ) print(response.json())
注意:手动生成的令牌到期后必须重新刷新,无法延长到1天或更久——这是Google的安全机制,短期令牌能降低密钥泄露带来的风险。
误解澄清
你提到的“有效期1天”大概率是混淆了服务账号密钥和Access Token:服务账号密钥本身是长期有效的(除非手动吊销),但用它生成的Access Token是短期的(1小时)。Admin SDK内部会自动用服务账号密钥定期刷新Access Token,所以你无需手动干预。
内容的提问来源于stack exchange,提问作者Ayush Rawat
相关产品推荐
相关产品推荐

