【问题标题】:Firebase Admin, Import Users doesn't workFirebase 管理员,导入用户不起作用
【发布时间】:2019-11-02 22:14:12
【问题描述】:

我的问题是:当用户在应用程序中更改电子邮件时,需要更改初始电子邮件(注册时的电子邮件)。 Firebase 支持建议我使用 Admin SDK:getUser(uid) 和 importUsers(UserRecord)。我做到了,但importUsers(UserRecord) 对我不起作用。我在index.js 文件中的代码:

获取用户数据:

 admin.auth().getUser("DRDYMZLfg2MkKm5JklYWc9LmlOo2")
  .then(function(userRecord) {
    // See the UserRecord reference doc for the contents of userRecord.
    console.log('Successfully fetched user data:', userRecord.toJSON());
  })
  .catch(function(error) {
    console.log('Error fetching user data:', error);
  });    

导入用户:

 let userImportRecords = [
{
 uid: 'DRDYMZLfg2MkKm5JklYWc9LmlOo2',
 email: 'test11@mywaves.mobi',
 emailVerified: false,
 displayName: undefined,
 photoURL: undefined,
 phoneNumber: undefined,
 disabled: false,
 metadata:
  { lastSignInTime: 'Wed, 19 Jun 2019 03:42:38 GMT',
  creationTime: 'Wed, 19 Jun 2019 03:40:01 GMT' },
  passwordHash: 'UkVEQUNURUQ=',
  passwordSalt: undefined,
  customClaims: undefined,
  tokensValidAfterTime: 'Wed, 19 Jun 2019 03:42:40 GMT',
  providerData:
  [ { uid: 'test11@mywaves.mobi',
   displayName: undefined,
   email: 'test11@mywaves.mobi',
   photoURL: undefined,
   providerId: 'password',
   phoneNumber: undefined } ]
  },
  //...
  ];



admin.auth().importUsers(userImportRecords)
  .then(function(userImportResult) {
    console.log(userImportResult);
    // The number of successful imports is determined via: userImportResult.successCount.
    // The number of failed imports is determined via: userImportResult.failureCount.
    // To get the error details.
    userImportResult.forEach(function(indexedError) {
        // The corresponding user that failed to upload.
        console.log(userImportRecords[indexedError.index].uid +' failed to import',
            indexedError.error);
    });
  })
  .catch(function(error) {
    // Some unrecoverable error occurred that prevented the operation from running.
  });

在终端我有

{ successCount: 0,
  failureCount: 1,
  errors: [ { index: 0, error: [FirebaseAuthError] } ] }

如何解决 FirebaseAuthError?

UPD:错误是

{ Error: The password hash must be a valid byte buffer.
    at FirebaseAuthError.FirebaseError [as constructor] (/Users/xxx/node_modules/firebase-admin/lib/utils/error.js:42:28)
    at FirebaseAuthError.PrefixedFirebaseError [as constructor] (/Users/xxx/node_modules/firebase-admin/lib/utils/error.js:88:28)
    at new FirebaseAuthError (/Users/xxx/node_modules/firebase-admin/lib/utils/error.js:146:16)
    at populateUploadAccountUser (/Users/xxx/node_modules/firebase-admin/lib/auth/user-import-builder.js:55:19)
    at /Users/xxx/node_modules/firebase-admin/lib/auth/user-import-builder.js:295:30
    at Array.forEach (<anonymous>)
    at UserImportBuilder.populateUsers (/Users/xxx/node_modules/firebase-admin/lib/auth/user-import-builder.js:293:15)
    at new UserImportBuilder (/Users/xxx/node_modules/firebase-admin/lib/auth/user-import-builder.js:121:36)
    at FirebaseAuthRequestHandler.uploadAccount (/Users/xxx/node_modules/firebase-admin/lib/auth/auth-api-request.js:557:33)
    at Auth.BaseAuth.importUsers (/Users/xxx/node_modules/firebase-admin/lib/auth/auth.js:281:40)   errorInfo:    { code: 'auth/invalid-password-hash',
     message: 'The password hash must be a valid byte buffer.' },   codePrefix: 'auth' }

【问题讨论】:

  • 如果你console.log(error),它会显示什么?

标签: javascript node.js firebase-authentication firebase-admin


【解决方案1】:

密码哈希必须指定为Buffer,而不是字符串。请参阅https://firebase.google.com/docs/auth/admin/import-users 上的示例

【讨论】:

  • 感谢您的回答。我已经这样做了,有一个新的error:.../node_modules/firebase-admin/lib/auth/user-import-builder.js:176 if (!validator.isNonNullObject(options.hash)) { TypeError: Cannot read property 'hash' of undefined....
  • 在导入带密码的用户时必须指定 UserImportOptions。
  • 我该怎么做?我删除了 userImportOptions 因为我不知道它是什么以及描述这个属性的正确程度。
【解决方案2】:

尽管文档声明 passwordHash 应该是缓冲区,但 SDK 接受字符串而不是缓冲区。 (https://firebase.google.com/docs/auth/admin/import-users)

我使用的是这种格式,如文档中所示:

{
  uid: 'uid1',
  email: 'user1@example.com',
  passwordHash: Buffer.from('passwordHash1'),
  passwordSalt: Buffer.from('salt1')
}

仍然收到无效的字节缓冲区错误:

Error creating new user: { Error: The password hash must be a valid byte buffer.
    at FirebaseAuthError.FirebaseError [as constructor] (xxxx/node_modules/firebase-admin/lib/utils/error.js:42:28)
    at FirebaseAuthError.PrefixedFirebaseError [as constructor] (xxxx/node_modules/firebase-admin/lib/utils/error.js:88:28)
    at new FirebaseAuthError (xxxx/node_modules/firebase-admin/lib/utils/error.js:147:16)
    at validateCreateEditRequest (xxxx/node_modules/firebase-admin/lib/auth/auth-api-request.js:430:15)
    at xxxx/node_modules/firebase-admin/lib/auth/auth-api-request.js:601:5
    at xxxx/node_modules/firebase-admin/lib/auth/auth-api-request.js:1462:13

如果你去/node_modules/firebase-admin/lib/auth/auth-api-request.js:430:15,你会发现如下代码:

    // passwordHash has to be a base64 encoded string.
    if (typeof request.passwordHash !== 'undefined' &&
        !validator.isString(request.passwordHash)) {
        throw new error_1.FirebaseAuthError(error_1.AuthClientErrorCode.INVALID_PASSWORD_HASH);
    }

错误信息并没有改变:

    AuthClientErrorCode.INVALID_PASSWORD_HASH = {
        code: 'invalid-password-hash',
        message: 'The password hash must be a valid byte buffer.',
    };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 2020-06-29
    相关资源
    最近更新 更多