Firebase DB HTTP API 身份验证:何时以及如何刷新 JWT 令牌?

2024-03-28

我正在尝试使用 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。对我来说这似乎不是最佳选择。是否可以生成永不过期的令牌?


感谢您提供代码示例。我通过使用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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Firebase DB HTTP API 身份验证:何时以及如何刷新 JWT 令牌? 的相关文章

随机推荐

  • Spring Security 将 URL 参数传递给身份验证提供程序

    有没有办法将 URL 参数传递给 Spring Security 3 中的身份验证提供程序 我们的登录页面需要接收电子邮件令牌作为参数 身份验证系统在设置用户状态时需要了解该参数 具体来说 它将允许具有正确令牌的用户登录 否则该用户将无法登
  • Pandas 根据拆分另一列添加新列

    我有一个如下所示的 pandas 数据框 A B US 65 AMAZON 2016 US 65 EBAY 2016 我的目标是看起来像这样 A B country code com US 65 AMAZON 2016 US 65 AMAZ
  • PE 文件中的 OSMajor 和 OSMinor 版本号

    最近我偶然发现了一个奇怪的现象 我正在为 PE 文件构建一个转储程序 很好地阅读了节标题和 可选 节标题 现在 当我到达 OS Major 和 OS Minor 字段时 我注意到一个奇怪的值 WORD OS VERSION major 0x
  • 我应该在 URL 中使用重音字符吗?

    当用英语以外的语言创建网页内容时 搜索引擎优化和用户友好 URL 的问题就会出现 我想知道在 URL 中使用去重音字母是否是最佳实践 冒着某些单词在有或没有某些重音的情况下具有完全不同含义的风险 或者最好坚持使用非英语字符在不太高级的环境
  • CCAvenue:“解密应用程序请求时出错!”

    我正在尝试将 CCAvenue 支付网关集成到我用 swift 4 开发的 iOS 应用程序中 我正进入 状态 错误 解密应用程序请求时出现问题 我已检查以下网址给出的答案 https stackoverflow com a 3732712
  • codegen 和标量结构参数

    Codegen 命令如下 codegen config dll ep1 args single 0 ep2 args 0 0 对于这样的函数来说很容易 function y ep1 u codegen y u function y ep2
  • Python基线校正库

    我目前正在处理一些拉曼光谱数据 并且正在尝试纠正由花期偏差引起的数据 看看下面的图表 我已经非常接近实现我想要的了 正如您所看到的 我试图在所有数据中拟合多项式 而我实际上应该在局部最小值处拟合多项式 理想情况下 我想要一个多项式拟合 当从
  • 如何确定 rspec 控制器测试的主题?

    所以除了好奇之外 我没有什么充分的理由需要知道这一点 最好的理由 但我不确定这里发生了什么 背景 我正在研究 RSpec 书并更新示例 第 24 章 Rails 控制器有一个消息控制器的测试 spec controllers message
  • .NET 结构中的成员相等测试使用什么算法?

    NET 结构中的成员相等测试使用什么算法 我想知道这一点 以便我可以将其用作我自己的算法的基础 我正在尝试为任意对象 在 C 中 编写递归成员相等测试 以测试 DTO 的逻辑相等性 如果 DTO 是结构 则这会容易得多 因为 ValueTy
  • 如何在 blazor wasm 中创建可供下载的 pdf

    在 blazor wasm 中 我想创建一个 pdf 并使其可下载 我测试过pdfflow https www pdfflow io 但只能使其在控制台应用程序中运行 有几种商业解决方案 devexpress syncfusion 但它们确
  • 如何更改 core-image-minimal yocto 中的 init 系统

    我想根据以下内容创建一个新目标core image minimal我想更改 init 系统systemd over SysV init 我希望我的更改是永久性的 不基于 local conf 我怎样才能做到这一点 Edit 正如安德斯在评论
  • 当目标位于另一个 AppDomain 中时,非托管到托管的回调要慢得多

    我使用委托从非托管代码调用托管代码 当我调用默认 AppDomain 中的托管代码时 我测量到每次调用的平均时间为 5 4 纳秒 当我调用第二个 AppDomain 时 我测量到每次调用需要 194 纳秒 默认VS2017 x86发布配置
  • 无法解析库模块中的 Kotlin Android 扩展布局

    我有我的buyer seller模块和一个common模块 两者都使用的布局很少buyer and seller模块被放置在common module common gt layout toolbar xml buyer gt activi
  • 实体框架插入具有相关对象的对象

    我是实体框架的新手 我需要插入一个对象Comment具有相关的 FK 对象User进入数据库 public Class Comment public int CommentID get set public string CommentCo
  • Erlang 中事件流(又名 CEP)的实时关联/分析有什么框架吗?

    想要分析具有某些特征 例如公共来源 的事件流 并在给定的时间窗口内 最终将这些多个事件关联起来并从中得出一些推论 最后启动一些操作 我对复杂事件处理 CEP 的有限了解告诉我 它是此类事情的理想选择 然而 在我迄今为止的研究中 我发现人们将
  • FB.event.subscribe comment.create 无需用户操作即可执行操作[重复]

    这个问题在这里已经有答案了 好的 这就是我的问题 我试图在 Facebook 评论中发表评论后向个别帖子的作者发送一封电子邮件 以通知作者已发表评论 评论框位于 K2 项目中 在 Joomla 中 FB event subscribe co
  • stackwalker加载所有符号文件,但仍然没有符号化任何东西

    我可能做错了什么 但我无法弄清楚这一点 我有一个在 Windows 上生成的简单崩溃小型转储 如果我在 Visual Studio 中打开转储 它会毫无问题地加载并显示崩溃线 但我无法让它在 minidump stackwalker 中进行
  • Java 是否保证当前同步的对象不会被垃圾回收?

    当线程持有其监视器时 是否可以保证对象不会被垃圾收集 e g class x private WeakReference r Object getMonitorObject Object o new Object r new WeakRef
  • 如何通过添加像素跟踪来跟踪各个收件人的阅读状态

    我正在构建一个电子邮件应用程序 其功能是在发送电子邮件后查看已读收件人 例如 如果我向 P1 发送了一封电子邮件并抄送 P2 和 P3 那么当 P1 打开电子邮件时 我作为发件人应该能够看到 P1 阅读了他们的电子邮件 为了实现这一目标 我
  • Firebase DB HTTP API 身份验证:何时以及如何刷新 JWT 令牌?

    我正在尝试使用 HTTP API 将 Python Web 应用程序写入 Firebase DB 我正在使用 Google I O 2016 上推出的新版本 Firebase 到目前为止 我的理解是 我想要完成的特定类型的写入是通过对此类型