【问题标题】:How to use firestore as the back-end for a REST API [duplicate]如何使用 Firestore 作为 REST API 的后端 [重复]
【发布时间】:2021-09-26 01:24:29
【问题描述】:

Firestore 非常适合创建无服务器应用程序,但我目前正在尝试使用 Firestore 作为我的 REST API 的主要系统。我希望能够使用休息端点创建会话并将令牌传递给客户端和从客户端传递令牌。我希望能够使用这些令牌进行 Authenticated 调用,并让 firebase auth 通过我设置的规则自动处理数据库规则,就像我使用 firestore 客户端 sdk 一样。

我熟悉 Firebase 管理员,但出于显而易见的原因,我不能将其用于经过身份验证的请求,至少不能直接使用。我想知道是否有一个“Firebase-Admin”可以传递令牌。

【问题讨论】:

  • 目前不可以。

标签: node.js firebase rest google-cloud-firestore firebase-authentication


【解决方案1】:

是的,Firebase Admin SDK 应该用于云功能或您自己的服务器等安全环境中。它使用服务帐号,可以完全访问您的 Firebase 项目的资源,并且不遵守任何安全规则。

话虽如此,您需要手动验证您的用户并检查他们是否被允许访问他们请求的资源。您必须在标头或正文中的 REST API 请求中传递 Firebase ID 令牌(我通常将其作为 'Bearer <firebase_id_token>' 在授权标头中传递)。在任何情况下,您不得传递用户自身的 UID。

按照以下步骤启动并运行 Admin SDK:

1.安装 Admin SDK:

npm install firebase-admin
# yarn add firebase-admin

2。创建一个中间件来验证 ID Tokens:

const express = require("express")
const app = express()
const admin = require("firebase-admin")

admin.initializeApp(...) // <-- use the service account to initialize

app.use(async function(req, res, next) {
  const {authorization} = req.headers
  if (!authorization) return res.sendStatus(401)
  const decodedToken = await admin.auth().verifyIdToken(authorization)
  console.log(decodedToken)
  next()
})

// other endpoints

app.listen(3000)

decodedToken 包含用户的 UID、自定义声明和其他元数据。您可以在documentation 中阅读更多相关信息。

您可以从这里下载您的服务帐户密钥https://console.firebase.google.com/project/_/settings/serviceaccounts/adminsdk

Firebase 会在用户登录时生成 ID 令牌(访问令牌)和刷新令牌。您只需在请求中传递该访问令牌即可。可以使用getIdToken方法获取。

async function callAPI() {
  const idToken = await firebase.auth().currentUser.getIdToken()
  const response = await fetch("url", {headers: {authorization: idToken}})
}

【讨论】:

  • 这正是我所需要的,您能否详细说明如何获取该令牌(使用 firebase 管理员?)。我的前端开发人员想要端点 {username, password} -> return token -> request {token: 1234567}
  • @DucksEatTurtles 您不使用 Admin SDK 生成令牌。您可以从客户端 SDK 本身获取它们。 const idToken = await firebase.auth().getIdToken()。这将是一个 JWT(存活大约一个小时),Firebase 会为您刷新它们。您所要做的就是当您需要调用 API 时,使用上面的代码行获取令牌并将其添加到您的 fetch 请求中。我会在我的答案中更新相同的内容。
  • 所以我们尝试走这条路的原因是为了避免烦人的 onAuthStateChanged 参数,因为在使用 redux 提供程序时它会导致很多问题,我们必须将整个组件包装在 onAuthStateChanged 中。不过,您的解决方案应该足够了,谢谢!
  • @DucksEatTurtles 使用身份验证侦听器由您决定。这不是使用 getIdToken 方法所必需的。检查更新答案,我添加了一个示例。
  • 您的答案几乎完美,但仅供参考,我相信您需要在 auth 的 currentUser 字段上调用 ​​getIdToken -> firebase.auth().currentUser.getIdToken()。无论如何,感谢您的回答!
猜你喜欢
  • 1970-01-01
  • 2019-08-12
  • 2015-04-23
  • 1970-01-01
  • 1970-01-01
  • 2019-01-05
  • 2015-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多