gpt4 book ai didi

python - Firebase DB HTTP API 身份验证 : When and how to refresh JWT token?

转载 作者:太空宇宙 更新时间:2023-11-03 12:03:56 25 4
gpt4 key购买 nike

我正在尝试使用 HTTP API 将 Python webapp 写入 Firebase DB(我使用的是在 Google I/O 2016 上展示的新版本的 Firebase)。

到目前为止,我的理解是我想要完成的特定类型的写入是通过对此类 URL 的 POST 请求进行的:

https://my-project-id.firebaseio.com/{path-to-resource}.json

我缺少的是 auth 部分:如果我正确理解,JWT 应该作为 Authorization : Bearer {token} 在 HTTP Authorization header 中传递。

所以我创建了一个服务帐户,下载了它的私钥并用它来生成 JWT,将它添加到请求 header 中,请求成功写入了 Firebase DB。

现在 JWT 已过期,对 firebase 数据库的任何类似请求都失败了。

当然我应该生成一个新 token ,但问题是:我不希望处理 token 生成并刷新自己,我习惯的大多数 HTTP API 只需要在请求中传递一个静态 api key ,所以只需将 stati api key 字符串添加到请求中,我的 webapps 就可以保持相对简单。

如果我必须处理 token 的生成和过期,webapp 逻辑需要变得更复杂(因为我必须存储 token ,检查它是否仍然有效并在无效时生成一个新的),或者我可以为每个请求生成一个新 token (但这真的有意义吗?)。

我想知道在这方面是否有可遵循的最佳实践,或者我是否遗漏了有关此主题的文档中的某些内容。

谢谢,马可


附录

这是我目前正在运行的代码:

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。这对我来说似乎不是最佳选择。是否可以生成不会过期的 token ?

最佳答案

感谢您提供代码示例。我通过使用 credentials.authorize 函数让它更好地工作,该函数为 http 创建一个经过身份验证的包装器。

from oauth2client.service_account import ServiceAccountCredentials
from httplib2 import Http
import json

_BASE_URL = 'https://my-app-id.firebaseio.com'
_SCOPES = [
'https://www.googleapis.com/auth/userinfo.email',
'https://www.googleapis.com/auth/firebase.database'
]

# Get the credentials to make an authorized call to firebase
credentials = ServiceAccountCredentials.from_json_keyfile_name(
_KEY_FILE_PATH, scopes=_SCOPES)

# Wrap the http in the credentials. All subsequent calls are authenticated
http_auth = credentials.authorize(Http())

def post_object(path, objectToSave):
url = _BASE_URL + path

resp, content = http_auth.request(
uri=url,
method='POST',
headers={'Content-Type': 'application/json'},
body=json.dumps(objectToSave),
)

return content

objectToPost = {
'title': "title",
'message': "alert"
}

print post_object('/path/to/write/to.json', objectToPost)

关于python - Firebase DB HTTP API 身份验证 : When and how to refresh JWT token?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38631037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com