【问题标题】:create user with self-specified uid使用自定义的 uid 创建用户
【发布时间】:2019-10-09 13:19:57
【问题描述】:

我正在使用flutter和firebase来管理我的用户,在这个链接中,它说你可以在用户创建期间指定uid:https://firebase.google.com/docs/auth/admin/manage-users#create_a_user

我的问题: dart/flutter 中的等价物是什么?我了解 firebase 会为您自动生成一个,但在我的用例中,我需要能够指定我的。

对于颤振,我只知道 createUserWithEmailAndPassword 方法,但它没有 'uid' 参数。

FirebaseAuth.instance.createUserWithEmailAndPassword(email: null, password: null)

然而,在上面的链接中,他们提供了一个使用此类方法的示例 (node.js)。

admin.auth().createUser({
  uid: 'some-uid',
  email: 'user@example.com',
  phoneNumber: '+11234567890'
})
  .then(function(userRecord) {
    // See the UserRecord reference doc for the contents of userRecord.
    console.log('Successfully created new user:', userRecord.uid);
  })
  .catch(function(error) {
    console.log('Error creating new user:', error);
  });

【问题讨论】:

    标签: firebase flutter dart firebase-authentication


    【解决方案1】:

    您可以通过实施自定义提供程序来完全控制 Firebase 身份验证用户的创建。但正如您可能想象的那样,这是一项敏感操作,因此代码要求您拥有对 Firebase 项目的完全管理权限。因此,您不能在 Flutter 应用中运行此类操作,而必须在受信任的环境中运行,例如您的开发机器、您控制的服务器或 Cloud Functions。

    通常这意味着:

    1. 您将在 Flutter 应用中收集用户的凭据
    2. 将它们(安全地)发送到服务器上的自定义端点
    3. 并在那里验证用户凭据是否正确
    4. 并使用Admin SDK to create a token for the user
    5. 然后您将其安全地发送回 Flutter 应用

    【讨论】:

    • 只是想弄清楚这一点,客户端 SDK 是否仍会在登录并在步骤 5 中返回令牌后照常管理客户端上的令牌刷新?
    • 对于自定义提供程序,您必须自己处理令牌刷新,因为 SDK 无法知道如何刷新您创建的令牌。
    • 我已按照您的步骤进行操作,首先感谢,它帮助我解决了使用从另一台服务器提供给我的 UID 的问题,并让我的规则检查“.. if request .auth != null”。也许我的问题不清楚,我想知道从现在在 Flutter 中使用的 firebase 收到的令牌是否会在应用程序中自动刷新,就像您使用来自客户端的正常 firebase 身份验证时一样。我现在正在使用 signInWithCustomToken(token_response) 登录。
    • "thanks first of all" -> upvotes 赞赏?上述场景导致自定义令牌,并且客户端SDK不会自动刷新这些令牌,因为它无法知道如何刷新服务器端代码生成的令牌。
    • 我不得不与团队再次核对,实际上我之前错了。事实证明,当你在客户端调用signInWithCustomToken(token) 时,SDK 确实会每隔一小时自动刷新一次 ID 令牌。
    【解决方案2】:

    对于任何平台(Android、iOS、Web、Flutter 等)上的任何 Firebase 客户端 SDK,都没有这样的选项。

    Firebase Admin 是一个服务器 SDK,它相信调用其方法的代码具有特权并在安全可信的环境中运行。这被认为对于发明 UID 是安全的。客户端 SDK 在用户设备上运行,这被认为是不受信任的并且可能会受到损害。在这种情况下,Firebase 身份验证产品必须为用户提供适当的 UID。

    【讨论】:

      【解决方案3】:

      使用 firebase 云功能

      const functions = require("firebase-functions");
      const admin = require("firebase-admin");
      admin.initializeApp();
      
      exports.createUser1 = functions.https.onCall(async (data, _context) => {
        try {
          const user = await admin.auth().createUser({
            uid: data.uid,
            phoneNumber: data.phoneNumber,
            disabled: false,
          }); return {response: user};
        } catch (error) {
          throw new functions.https.HttpsError("failed to create a user");
        }
      });
      

      然后从 Flutter 应用请求

      {
          "data":
          {
              "uid": "12345678",
              "phoneNumber": "+905378227777",
              "disabled": false
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2020-03-20
        • 2021-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-07
        相关资源
        最近更新 更多