nj4567
nj4567

Reputation: 73

How to prepare users password for firebase importUsers?

I have a large json file with all my previous users. I need to prepare them to be imported. I keep getting this error : Error 4 failed to import: FirebaseAuthError: The password hash must be a valid byte buffer.

What is the proper way to store a hashed password as byte buffer in a json?

var jsonFile = require('./users.json');
var fs = require('fs')

let newArr = []

jsonFile.file.slice(0, 5).map( val => {
    newArr.push({
        uid: val.id,
        email: val.email,
        passwordHash: Buffer.from(val.password) // val.password is hashed
    })
})

let data = JSON.stringify(newArr);
fs.writeFileSync('newArr.json', data);

In my main import file

var jsonFile = require('./newArr.json');

// I was testing it like that and everything is working fine.
const userImportRecords = [
    {
        uid: '555555555555',
        email: '[email protected]',
        passwordHash: Buffer.from('$2a$10$P6TOqRVAXL2FLRzq9Ii6AeGqzV4mX8UNdpHvlLr.4DPxq2Xsd54KK')
    }
];

admin.auth().importUsers(jsonFile, {
  hash: {
    algorithm: 'BCRYPT',
    rounds: 10
  }
})

Upvotes: 1

Views: 533

Answers (2)

nj4567
nj4567

Reputation: 73

I found a workaround to this problem. I'm parsing users.json directly inside the importUsers() file. Since I don't have to store the Buffer inside a json file again, the passwordHash stay a buffer.

This is the right way to do it

let newArr = []

jsonFile.file.slice(0, 5).map( val => {
    newArr.push({
        uid: val.id,
        email: val.email,
        passwordHash: Buffer.from(val.password)
    })
})

admin.auth().importUsers(newArr, {
  hash: {
    algorithm: 'BCRYPT',
    rounds: 10
  }
})

Upvotes: 0

Hiranya Jayathilaka
Hiranya Jayathilaka

Reputation: 7438

Your first code snippet writes Buffer values to the file system. This doesn't work the way you expect. For instance, try running the following example:

const val = {uid: 'test', passwordHash: Buffer.from('test')};
fs.writeFileSync('newArr.json', JSON.stringify(val));

The resulting file will contain the following text:

{"uid":"test","passwordHash":{"type":"Buffer","data":[116,101,115,116]}}

When you require() this file, the passwordHash gets assigned to the object { type: 'Buffer', data: [ 116, 101, 115, 116 ] }. That's not the Buffer type expected by the importUsers() API.

I believe your newArr variable contains the right kind of array that can be passed into importUsers(). But writing it to the file system, and then reloading it changes the type of all Buffer fields.

Upvotes: 1

Related Questions