我正在尝试使用 HTTP API 将 Python Web 应用程序写入 Firebase DB(我正在使用 Google I/O 2016 上推出的新版本 Firebase)。
到目前为止,我的理解是,我想要完成的特定类型的写入是通过对此类型的 URL 发出 POST 请求来完成的:
https://my-project-id.firebaseio.com/{path-to-resource}.json
我缺少的是身份验证部分:如果我正确地获取了 JWT,则应在 HTTP 授权标头中传递 JWT 作为Authorization : Bearer {token}
.
因此,我创建了一个服务帐户,下载其私钥并使用它生成 JWT,将其添加到请求标头,并且请求成功写入 Firebase DB。
现在 JWT 已过期,任何对 Firebase DB 的类似请求都将失败。
当然,我应该生成一个新的令牌,但问题是:我并不期望自己处理令牌生成并刷新,我习惯的大多数 HTTP API 只需要在请求中传递一个静态 api 密钥,以便我的 web 应用程序可以只需将 stati api 密钥字符串添加到请求中即可保持相对简单。
如果我必须处理令牌生成和过期,则 web 应用程序逻辑需要变得更加复杂(因为我必须存储令牌,检查它是否仍然有效,并在无效时生成一个新令牌),或者我可以生成每个请求都有一个新令牌(但这真的有意义吗?)。
我想知道在这方面是否有可遵循的最佳实践,或者我是否遗漏了有关该主题的文档中的某些内容。
谢谢,
马可
ADDENDUM
这是我当前正在运行的代码:
import requests
import json
from oauth2client.service_account import ServiceAccountCredentials
_BASE_URL = 'https://my-app-id.firebaseio.com'
_SCOPES = [
'https://www.googleapis.com/auth/userinfo.email',
'https://www.googleapis.com/auth/firebase.database'
]
def _get_credentials():
credentials = ServiceAccountCredentials.from_json_keyfile_name('my_service_account_key.json', scopes=_SCOPES)
return credentials.get_access_token().access_token
def post_object():
url = _BASE_URL + '/path/to/write/to.json'
headers = {
'Authorization': 'Bearer '+ _get_credentials(),
'Content-Type': 'application/json'
}
payload = {
'title': title,
'message': alert
}
return requests.post(url,
data=json.dumps(payload),
headers=headers)
目前,每个请求都会生成一个新的 JWT。对我来说这似乎不是最佳选择。是否可以生成永不过期的令牌?