【问题标题】:How to set new property in user metadata?如何在用户元数据中设置新属性?
【发布时间】:2019-11-22 06:19:26
【问题描述】:

我正在尝试在用户元数据中设置一些属性。我正在尝试使用https://firebase.google.com/docs/auth/admin/manage-sessions#revoke_refresh_tokens 然后https://firebase.google.com/docs/auth/admin/manage-sessions#update_user-specific_metadata_in 来执行此操作。

可能我做错了什么,因为它不起作用。如果我像本文中那样这样做,然后调用 auth().listUsers 来获取用户数据,“元数据”只有默认属性:creationTime 和 lastSignInTime,但没有新属性 revokeTime,有什么想法吗?

编辑:

我的撤销功能:

export const revokeUsersToken = functions.https.onCall(async (req, res) => {
  const admin = await import('firebase-admin');

  if (!isRevokeUsersTokenInitialized) {
    admin.initializeApp();
    isRevokeUsersTokenInitialized = true;
  }

  return admin
    .auth()
    .revokeRefreshTokens(req.uid)
    .then(() => {
      return admin.auth().getUser(req.uid);
    })
    .then(userRecord => {
      return new Date(userRecord.tokensValidAfterTime as string).getTime() / 1000;
    })
    .then(timestamp => {
      const metadataRef = admin.database().ref('metadata/' + req.uid);

      metadataRef.set({ revokeTime: timestamp }).then((x) => {
        return `Database updated successfully: ${x}`;
      }).catch(error => {
        return `Error: ${error}`;
      });
    });
});

然后,当我尝试获取所有用户时:

export const getListUsers = functions.https.onCall(async (req, res) => {
  const admin = await import('firebase-admin');

  if (!isGetListUsersInitialized) {
    admin.initializeApp();
    isGetListUsersInitialized = true;
  }
  const maxResults = 100; // optional arg.

  return admin
    .auth()
    .listUsers(maxResults)
    .then(userRecords => {
      return userRecords.users.map(user => {
        const {
          passwordHash,
          passwordSalt,
          phoneNumber,
          photoURL,
          providerData,
          tokensValidAfterTime,
          customClaims,
          ...us
        } = user;
        return {
          ...us,
          role: customClaims && customClaims.hasOwnProperty('role') ? (customClaims as any).role : null
        };
      });
    })
    .catch(error => console.log(error));
});

如果我得到此用户列表,则没有关于新元数据属性的信息

【问题讨论】:

  • 更好?抱歉,大部分代码都在 firebase 指南中;-)
  • 我不清楚问题是什么。您共享的哪一行代码没有按照您的预期执行?它有什么作用?你期待什么?
  • 我在谈论这个 -> metadataRef.set({ revokeTime: timestamp })。它不应该为用户元数据设置新属性('revokeTime')?如果我调用 .auth().listUsers 我不应该在“userRecords”响应中看到该新属性?
  • 您正在将revokeTime 写入数据库,这与该用户的 Firebase 身份验证记录无关。

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


【解决方案1】:

您链接的文档描述了如何撤消用户对数据库的访问权限,而无需等待该用户的 ID 令牌过期。为此,它使用了两个产品:Firebase 身份验证和 Firebase 实时数据库。

但是两个产品互不相识,所以你写入数据库的revokeTime不会出现在用户的认证记录中。

【讨论】:

  • 是的,有道理,谢谢。我会尝试用不同的方式来做。
猜你喜欢
  • 2014-12-25
  • 1970-01-01
  • 2010-11-27
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 2015-01-04
  • 2013-03-03
  • 1970-01-01
相关资源
最近更新 更多