【问题标题】:How to add metadata to Firebase authentication如何将元数据添加到 Firebase 身份验证
【发布时间】:2020-01-03 22:15:13
【问题描述】:

我需要在使用 Firebase 身份验证的 google 登录期间传递自定义值 (device_id)。该值稍后通过侦听身份验证事件触发器从云函数中获取,然后将该值添加到 Firestore

我了解您可以将值作为查询参数传递给 http 触发器。但是,在我的情况下,我只需要在身份验证期间和之后通过并获取值。因此,firebase 身份验证中是否存在某种 auth.addMetaData(metadata) 函数?

我需要能够在身份验证触发后检索自定义数据,就像我们可以执行 user.email 一样。我需要类似 user.custom_data 的东西

【问题讨论】:

    标签: firebase firebase-authentication google-cloud-functions


    【解决方案1】:

    虽然 Doug 提到了 Firebase Custom Claims,但我认为值得额外的文档,因为它确实允许您将简单的元数据添加到 Firebase 用户对象。

    重要提示

    • 大警告:自定义声明仅在用户登录时刷新。因此,isAdministrator 声明将要求用户在激活之前注销/登录。
    • Firebase 建议“使用自定义声明存储数据仅用于控制用户访问。所有其他数据应通过实时数据库或其他服务器端存储单独存储。”

    设置元数据(仅限服务器)

    这是一个关于如何在 Firebase 用户对象上设置 device_id 的示例(在使用 firebase-admin 的服务器上):

    await admin.auth().setCustomUserClaims(uid, { deviceId })
    

    注意:您不能在客户端上设置自定义声明。

    获取元数据(服务器和客户端)

    然后从服务器上的用户那里检索device_id

    const userRecord = await admin.auth().getUser(uid)
    console.log(userRecord.customClaims.deviceId)
    

    …在客户端上:

    const idTokenResult = await firebase.auth().currentUser.getIdTokenResult()
    console.log(idTokenResult.claims.deviceId)
    

    在 Firebase 安全规则中使用元数据

    有趣的是,自定义声明也可以在 Firebase 安全规则中使用。这个(有点不切实际的)例子只允许deviceId === 123 的用户查看数据:

    {
      "rules": {
        "secureContent": {
          ".read": "auth.token.deviceId === 123"
        }
      }
    }
    

    更多信息

    【讨论】:

      【解决方案2】:

      Firebase 身份验证不支持客户端提供的任何类型的额外数据。与 Firebase 为每个用户存储的元数据最接近的是 custom claims,但是,存储在那里的 JSON blob 只能由特权服务器端应用程序设置。

      如果您需要为每个用户存储由客户端应用编写的数据,您可能应该为此使用受 Firebase 安全规则保护的数据库(Cloud Firestore 或实时数据库),以便只有最终用户才能读取和写入他们自己的数据。您还可以使用 HTTP 类型的 Cloud Function 将数据传递到您的函数中以记录在数据库中。

      【讨论】:

      • 好的,Doug,我将使用 HTTP 触发器。谢谢
      猜你喜欢
      • 1970-01-01
      • 2021-04-03
      • 2020-01-27
      • 2019-05-05
      • 1970-01-01
      • 2017-04-28
      • 2021-08-10
      • 2019-07-17
      • 2019-09-27
      相关资源
      最近更新 更多