ব্যবহারকারী ইমপোর্ট করা

Firebase Admin SDK, উন্নত বিশেষ অধিকার সহ Auth.importUsers() Firebase Authentication-এ বাল্কে ব্যবহারকারী ইমপোর্ট করার জন্য API প্রদান করে। এই ফিচারটি Firebase CLI-তেও উপলভ্য থাকলেও, অ্যাডমিন SDK আপনাকে মধ্যবর্তী CSV বা JSON ফাইল তৈরি না করেই এক্সটার্নাল অথেন্টিকেশন সিস্টেম বা অন্যান্য Firebase প্রোজেক্ট থেকে আগে থেকেই থাকা ব্যবহারকারীদের প্রোগ্রামাটিক উপায়ে আপলোড করতে দেয়।

ব্যবহারকারী ইমপোর্ট API নিম্নলিখিত সুবিধাগুলি প্রদান করে:

  • আলাদা পাসওয়ার্ড হ্যাশিং অ্যালগরিদম ব্যবহার করে এক্সটার্নাল যাচাইকরণ সিস্টেম থেকে ব্যবহারকারীদের মাইগ্রেট করার ক্ষমতা।
  • অন্য Firebase প্রোজেক্ট থেকে ব্যবহারকারীদের মাইগ্রেট করার সুবিধা।
  • দ্রুত ও কার্যকরভাবে বাল্ক ইমপোর্ট করার জন্য অপ্টিমাইজ করা হয়েছে। এই অপারেশন uid, email, phoneNumber বা অন্যান্য শনাক্তকারী ডুপ্লিকেট আছে কিনা তা চেক না করেই ব্যবহারকারীদের প্রসেস করে।
  • আগে থেকে থাকা OAuth ব্যবহারকারীদের মাইগ্রেট করা বা নতুন OAuth ব্যবহারকারী (Google, Facebook ইত্যাদি) তৈরি করার সুবিধা।
  • কাস্টম দাবি সহ ব্যবহারকারীদের সরাসরি বাল্কে ইমপোর্ট করার সুবিধা।

ব্যবহার

একটি API কলের মাধ্যমে সর্বাধিক ১০০০ জন ব্যবহারকারীর ডেটা ইমপোর্ট করা যায়। মনে রাখবেন, এই অপারেশনটি স্পিডের জন্য অপ্টিমাইজ করা হয়েছে এবং এটি uid, email, phoneNumber ও অন্যান্য অনন্য শনাক্তকারী ডুপ্লিকেট করা হয়েছে কিনা তা চেক করে না। আগে থেকে থাকা uid ব্যবহারকারীর সাথে মিলে যায় এমন কোনও ব্যবহারকারীকে ইমপোর্ট করলে, আগে থেকে থাকা ব্যবহারকারীকে পরিবর্তন করা হবে। অন্য কোনও ডুপ্লিকেট ফিল্ড (যেমন, email) সহ কোনও ব্যবহারকারীকে ইমপোর্ট করলে, একই ভ্যালু সহ অতিরিক্ত ব্যবহারকারী তৈরি হবে। ফলে, এই API ব্যবহার করার সময়, আপনাকে অবশ্যই নিশ্চিত করতে হবে যে আপনি কোনও অনন্য ফিল্ড ডুপ্লিকেট করছেন না।

Node.js

// Up to 1000 users can be imported at once.
const userImportRecords = [
  {
    uid: 'uid1',
    email: 'user1@example.com',
    passwordHash: Buffer.from('passwordHash1'),
    passwordSalt: Buffer.from('salt1'),
  },
  {
    uid: 'uid2',
    email: 'user2@example.com',
    passwordHash: Buffer.from('passwordHash2'),
    passwordSalt: Buffer.from('salt2'),
  },
  //...
];

জাভা

// Up to 1000 users can be imported at once.
List<ImportUserRecord> users = new ArrayList<>();
users.add(ImportUserRecord.builder()
    .setUid("uid1")
    .setEmail("user1@example.com")
    .setPasswordHash("passwordHash1".getBytes())
    .setPasswordSalt("salt1".getBytes())
    .build());
users.add(ImportUserRecord.builder()
    .setUid("uid2")
    .setEmail("user2@example.com")
    .setPasswordHash("passwordHash2".getBytes())
    .setPasswordSalt("salt2".getBytes())
    .build());

Python

# Up to 1000 users can be imported at once.
users = [
    auth.ImportUserRecord(
        uid='uid1',
        email='user1@example.com',
        password_hash=b'password_hash_1',
        password_salt=b'salt1'
    ),
    auth.ImportUserRecord(
        uid='uid2',
        email='user2@example.com',
        password_hash=b'password_hash_2',
        password_salt=b'salt2'
    ),
]

Go

// Up to 1000 users can be imported at once.
var users []*auth.UserToImport
users = append(users, (&auth.UserToImport{}).
	UID("uid1").
	Email("user1@example.com").
	PasswordHash([]byte("passwordHash1")).
	PasswordSalt([]byte("salt1")))
users = append(users, (&auth.UserToImport{}).
	UID("uid2").
	Email("user2@example.com").
	PasswordHash([]byte("passwordHash2")).
	PasswordSalt([]byte("salt2")))

C#

//  Up to 1000 users can be imported at once.
var users = new List<ImportUserRecordArgs>()
{
    new ImportUserRecordArgs()
    {
        Uid = "uid1",
        Email = "user1@example.com",
        PasswordHash = Encoding.ASCII.GetBytes("passwordHash1"),
        PasswordSalt = Encoding.ASCII.GetBytes("salt1"),
    },
    new ImportUserRecordArgs()
    {
        Uid = "uid2",
        Email = "user2@example.com",
        PasswordHash = Encoding.ASCII.GetBytes("passwordHash2"),
        PasswordSalt = Encoding.ASCII.GetBytes("salt2"),
    },
};

এই উদাহরণে, Firebase-কে নিরাপদে সাহায্য করার জন্য হ্যাশিং বিকল্প নির্দিষ্ট করা হয়েছে এইসব ব্যবহারকারী পরের বার Firebase Authentication-এর মাধ্যমে সাইন-ইন করার চেষ্টা করলে তাদের যাচাই করুন। সফলভাবে সাইন-ইন করার পরে, Firebase ইন্টার্নাল Firebase হ্যাশিং অ্যালগরিদম ব্যবহার করে ব্যবহারকারীর পাসওয়ার্ড আবার হ্যাশ করে। নিচে দেওয়া অ্যালগরিদম অনুযায়ী প্রয়োজনীয় ফিল্ড সম্পর্কে আরও জানুন।

Firebase Authentication ব্যবহারকারী-নির্দিষ্ট সমস্যা হলেও, প্রদান করা ব্যবহারকারীদের সম্পূর্ণ তালিকা আপলোড করার চেষ্টা করে। অপারেশনটি সফল ও ব্যর্থ ইমপোর্টের সারসংক্ষেপ সহ ফলাফল প্রদান করে। প্রতিটি ব্যর্থ ব্যবহারকারী ইমপোর্টের জন্য সমস্যার বিবরণ ফেরত দেওয়া হয়।

Node.js

getAuth()
  .importUsers(userImportRecords, {
    hash: {
      algorithm: 'HMAC_SHA256',
      key: Buffer.from('secretKey'),
    },
  })
  .then((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.errors.forEach((indexedError) => {
      // The corresponding user that failed to upload.
      console.log(
        'Error ' + indexedError.index,
        ' failed to import: ',
        indexedError.error
      );
    });
  })
  .catch((error) => {
    // Some unrecoverable error occurred that prevented the operation from running.
  });

জাভা

UserImportOptions options = UserImportOptions.withHash(
    HmacSha256.builder()
        .setKey("secretKey".getBytes())
        .build());
try {
  UserImportResult result = FirebaseAuth.getInstance().importUsers(users, options);
  System.out.println("Successfully imported " + result.getSuccessCount() + " users");
  System.out.println("Failed to import " + result.getFailureCount() + " users");
  for (ErrorInfo indexedError : result.getErrors()) {
    System.out.println("Failed to import user at index: " + indexedError.getIndex()
        + " due to error: " + indexedError.getReason());
  }
} catch (FirebaseAuthException e) {
  // Some unrecoverable error occurred that prevented the operation from running.
}

Python

hash_alg = auth.UserImportHash.hmac_sha256(key=b'secret_key')
try:
    result = auth.import_users(users, hash_alg=hash_alg)
    print(
        f'Successfully imported {result.success_count} users. Failed to import '
        f'{result.failure_count} users.')
    for err in result.errors:
        print(f'Failed to import {users[err.index].uid} due to {err.reason}')
except exceptions.FirebaseError:
    # Some unrecoverable error occurred that prevented the operation from running.
    pass

Go

client, err := app.Auth(ctx)
if err != nil {
	log.Fatalln("Error initializing Auth client", err)
}

h := hash.HMACSHA256{
	Key: []byte("secretKey"),
}
result, err := client.ImportUsers(ctx, users, auth.WithHash(h))
if err != nil {
	log.Fatalln("Unrecoverable error prevented the operation from running", err)
}

log.Printf("Successfully imported %d users\n", result.SuccessCount)
log.Printf("Failed to import %d users\n", result.FailureCount)
for _, e := range result.Errors {
	log.Printf("Failed to import user at index: %d due to error: %s\n", e.Index, e.Reason)
}

C#

var options = new UserImportOptions()
{
    Hash = new HmacSha256()
    {
        Key = Encoding.ASCII.GetBytes("secretKey"),
    },
};

try
{
    UserImportResult result = await FirebaseAuth.DefaultInstance.ImportUsersAsync(users, options);
    Console.WriteLine($"Successfully imported {result.SuccessCount} users");
    Console.WriteLine($"Failed to import {result.FailureCount} users");
    foreach (ErrorInfo indexedError in result.Errors)
    {
        Console.WriteLine($"Failed to import user at index: {indexedError.Index}"
            + $" due to error: {indexedError.Reason}");
    }
}
catch (FirebaseAuthException)
{
    // Some unrecoverable error occurred that prevented the operation from running.
}

পাসওয়ার্ড হ্যাশিংয়ের প্রয়োজন না হলে (ফোন নম্বর, কাস্টম টোকেন ব্যবহারকারী, OAuth ব্যবহারকারী ইত্যাদি), হ্যাশিং বিকল্প প্রদান করবেন না।

Firebase scrypt হ্যাশ করা পাসওয়ার্ড সহ ব্যবহারকারীদের ইমপোর্ট করা

সাধারণত, Firebase পাসওয়ার্ড সেভ করার জন্য scrypt হ্যাশিং অ্যালগরিদমের পরিবর্তিত Firebase ভার্সন ব্যবহার করে। আগে থেকে থাকা অন্য Firebase প্রোজেক্ট থেকে ব্যবহারকারীদের মাইগ্রেট করার জন্য পরিবর্তিত scrypt ব্যবহার করে হ্যাশ করা পাসওয়ার্ড ইমপোর্ট করা কাজে লাগে। এটি করার জন্য মূল প্রোজেক্টের ইন্টার্নাল প্যারামিটার নির্ধারণ করতে হবে।

Firebase প্রতিটি Firebase প্রোজেক্টের জন্য অনন্য পাসওয়ার্ড হ্যাশ প্যারামিটার তৈরি করে। এইসব প্যারামিটার কীভাবে অ্যাক্সেস করবেন তা এখানে দেওয়া হল:

  1. Firebase কনসোলে, নিরাপত্তা > যাচাইকরণ > ব্যবহারকারী ট্যাব বিকল্পে যান।

  2. ব্যবহারকারীদের টেবিল তালিকার উপরের ডানদিকের কোণে থাকা ড্রপ-ডাউন থেকে পাসওয়ার্ড হ্যাশ প্যারামিটার বেছে নিন।

এই অ্যালগরিদমের জন্য হ্যাশ বিকল্প তৈরি করতে প্রয়োজনীয় প্যারামিটারগুলির মধ্যে এগুলি অন্তর্ভুক্ত:

  • key: সইকারীর কী সাধারণত base64 এনকোডিংয়ে প্রদান করা হয়।
  • saltSeparator: base64 এনকোডিংয়ে সাধারণত সল্ট সেপারেটর দেওয়া হয় (ঐচ্ছিক)।
  • rounds: পাসওয়ার্ড হ্যাশ করার জন্য ব্যবহৃত রাউন্ডের সংখ্যা।
  • memoryCost: এই অ্যালগরিদমের জন্য প্রয়োজনীয় মেমরি খরচ।

Node.js

getAuth()
  .importUsers(
    [
      {
        uid: 'some-uid',
        email: 'user@example.com',
        // Must be provided in a byte buffer.
        passwordHash: Buffer.from('base64-password-hash', 'base64'),
        // Must be provided in a byte buffer.
        passwordSalt: Buffer.from('base64-salt', 'base64'),
      },
    ],
    {
      hash: {
        algorithm: 'SCRYPT',
        // All the parameters below can be obtained from the Firebase Console's users section.
        // Must be provided in a byte buffer.
        key: Buffer.from('base64-secret', 'base64'),
        saltSeparator: Buffer.from('base64SaltSeparator', 'base64'),
        rounds: 8,
        memoryCost: 14,
      },
    }
  )
  .then((results) => {
    results.errors.forEach((indexedError) => {
      console.log(`Error importing user ${indexedError.index}`);
    });
  })
  .catch((error) => {
    console.log('Error importing users :', error);
  });

জাভা

try {
  List<ImportUserRecord> users = Collections.singletonList(ImportUserRecord.builder()
      .setUid("some-uid")
      .setEmail("user@example.com")
      .setPasswordHash(BaseEncoding.base64().decode("password-hash"))
      .setPasswordSalt(BaseEncoding.base64().decode("salt"))
      .build());
  UserImportOptions options = UserImportOptions.withHash(
      Scrypt.builder()
          // All the parameters below can be obtained from the Firebase Console's "Users"
          // section. Base64 encoded parameters must be decoded into raw bytes.
          .setKey(BaseEncoding.base64().decode("base64-secret"))
          .setSaltSeparator(BaseEncoding.base64().decode("base64-salt-separator"))
          .setRounds(8)
          .setMemoryCost(14)
          .build());
  UserImportResult result = FirebaseAuth.getInstance().importUsers(users, options);
  for (ErrorInfo indexedError : result.getErrors()) {
    System.out.println("Failed to import user: " + indexedError.getReason());
  }
} catch (FirebaseAuthException e) {
  System.out.println("Error importing users: " + e.getMessage());
}

Python

users = [
    auth.ImportUserRecord(
        uid='some-uid',
        email='user@example.com',
        password_hash=base64.urlsafe_b64decode('password_hash'),
        password_salt=base64.urlsafe_b64decode('salt')
    ),
]

# All the parameters below can be obtained from the Firebase Console's "Users"
# section. Base64 encoded parameters must be decoded into raw bytes.
hash_alg = auth.UserImportHash.scrypt(
    key=base64.b64decode('base64_secret'),
    salt_separator=base64.b64decode('base64_salt_separator'),
    rounds=8,
    memory_cost=14
)
try:
    result = auth.import_users(users, hash_alg=hash_alg)
    for err in result.errors:
        print('Failed to import user:', err.reason)
except exceptions.FirebaseError as error:
    print('Error importing users:', error)

Go

b64URLdecode := func(s string) []byte {
	b, err := base64.URLEncoding.DecodeString(s)
	if err != nil {
		log.Fatalln("Failed to decode string", err)
	}

	return b
}
b64Stddecode := func(s string) []byte {
	b, err := base64.StdEncoding.DecodeString(s)
	if err != nil {
		log.Fatalln("Failed to decode string", err)
	}
	return b
}
// Users retrieved from Firebase Auth's backend need to be base64URL decoded
users := []*auth.UserToImport{
	(&auth.UserToImport{}).
		UID("some-uid").
		Email("user@example.com").
		PasswordHash(b64URLdecode("password-hash")).
		PasswordSalt(b64URLdecode("salt")),
}

// All the parameters below can be obtained from the Firebase Console's "Users"
// section. Base64 encoded parameters must be decoded into raw bytes.
h := hash.Scrypt{
	Key:           b64Stddecode("base64-secret"),
	SaltSeparator: b64Stddecode("base64-salt-separator"),
	Rounds:        8,
	MemoryCost:    14,
}
result, err := client.ImportUsers(ctx, users, auth.WithHash(h))
if err != nil {
	log.Fatalln("Error importing users", err)
}
for _, e := range result.Errors {
	log.Println("Failed to import user", e.Reason)
}

C#

try
{
    var users = new List<ImportUserRecordArgs>()
    {
        new ImportUserRecordArgs()
        {
            Uid = "some-uid",
            Email = "user@example.com",
            PasswordHash = Encoding.ASCII.GetBytes("password-hash"),
            PasswordSalt = Encoding.ASCII.GetBytes("salt"),
        },
    };

    var options = new UserImportOptions()
    {
        // All the parameters below can be obtained from the Firebase Console's "Users"
        // section. Base64 encoded parameters must be decoded into raw bytes.
        Hash = new Scrypt()
        {
            Key = Encoding.ASCII.GetBytes("base64-secret"),
            SaltSeparator = Encoding.ASCII.GetBytes("base64-salt-separator"),
            Rounds = 8,
            MemoryCost = 14,
        },
    };

    UserImportResult result = await FirebaseAuth.DefaultInstance.ImportUsersAsync(users, options);
    foreach (ErrorInfo indexedError in result.Errors)
    {
        Console.WriteLine($"Failed to import user: {indexedError.Reason}");
    }
}
catch (FirebaseAuthException e)
{
    Console.WriteLine($"Error importing users: {e.Message}");
}

স্ট্যান্ডার্ড scrypt হ্যাশ করা পাসওয়ার্ড সহ ব্যবহারকারীদের ইমপোর্ট করা

Firebase Authentication স্ট্যান্ডার্ড scrypt অ্যালগরিদম এবং পরিবর্তিত ভার্সন (উপরে) উভয়ের সাথেই কাজ করে। সাধারণ scrypt অ্যালগরিদমের জন্য, নিম্নলিখিত হ্যাশিং প্যারামিটার প্রয়োজন:

  • memoryCost: হ্যাশিং অ্যালগরিদমের CPU/মেমরি খরচ।
  • parallelization: হ্যাশিং অ্যালগরিদমের প্যারালাইজেশন।
  • blockSize: হ্যাশিং অ্যালগরিদমের ব্লক সাইজ (সাধারণত ৮)।
  • derivedKeyLength: হ্যাশিং অ্যালগরিদমের প্রাপ্ত কীয়ের দৈর্ঘ্য

Node.js

getAuth()
  .importUsers(
    [
      {
        uid: 'some-uid',
        email: 'user@example.com',
        // Must be provided in a byte buffer.
        passwordHash: Buffer.from('password-hash'),
        // Must be provided in a byte buffer.
        passwordSalt: Buffer.from('salt'),
      },
    ],
    {
      hash: {
        algorithm: 'STANDARD_SCRYPT',
        memoryCost: 1024,
        parallelization: 16,
        blockSize: 8,
        derivedKeyLength: 64,
      },
    }
  )
  .then((results) => {
    results.errors.forEach((indexedError) => {
      console.log(`Error importing user ${indexedError.index}`);
    });
  })
  .catch((error) => {
    console.log('Error importing users :', error);
  });

জাভা

try {
  List<ImportUserRecord> users = Collections.singletonList(ImportUserRecord.builder()
      .setUid("some-uid")
      .setEmail("user@example.com")
      .setPasswordHash("password-hash".getBytes())
      .setPasswordSalt("salt".getBytes())
      .build());
  UserImportOptions options = UserImportOptions.withHash(
      StandardScrypt.builder()
          .setMemoryCost(1024)
          .setParallelization(16)
          .setBlockSize(8)
          .setDerivedKeyLength(64)
          .build());
  UserImportResult result = FirebaseAuth.getInstance().importUsers(users, options);
  for (ErrorInfo indexedError : result.getErrors()) {
    System.out.println("Failed to import user: " + indexedError.getReason());
  }
} catch (FirebaseAuthException e) {
  System.out.println("Error importing users: " + e.getMessage());
}

Python

users = [
    auth.ImportUserRecord(
        uid='some-uid',
        email='user@example.com',
        password_hash=b'password_hash',
        password_salt=b'salt'
    ),
]

hash_alg = auth.UserImportHash.standard_scrypt(
    memory_cost=1024, parallelization=16, block_size=8, derived_key_length=64)
try:
    result = auth.import_users(users, hash_alg=hash_alg)
    for err in result.errors:
        print('Failed to import user:', err.reason)
except exceptions.FirebaseError as error:
    print('Error importing users:', error)

Go

users := []*auth.UserToImport{
	(&auth.UserToImport{}).
		UID("some-uid").
		Email("user@example.com").
		PasswordHash([]byte("password-hash")).
		PasswordSalt([]byte("salt")),
}
h := hash.StandardScrypt{
	MemoryCost:       1024,
	Parallelization:  16,
	BlockSize:        8,
	DerivedKeyLength: 64,
}
result, err := client.ImportUsers(ctx, users, auth.WithHash(h))
if err != nil {
	log.Fatalln("Error importing users", err)
}
for _, e := range result.Errors {
	log.Println("Failed to import user", e.Reason)
}

C#

try
{
    var users = new List<ImportUserRecordArgs>()
    {
        new ImportUserRecordArgs()
        {
            Uid = "some-uid",
            Email = "user@example.com",
            PasswordHash = Encoding.ASCII.GetBytes("password-hash"),
            PasswordSalt = Encoding.ASCII.GetBytes("salt"),
        },
    };

    var options = new UserImportOptions()
    {
        Hash = new StandardScrypt()
        {
            MemoryCost = 1024,
            Parallelization = 16,
            BlockSize = 8,
            DerivedKeyLength = 64,
        },
    };

    UserImportResult result = await FirebaseAuth.DefaultInstance.ImportUsersAsync(users, options);
    foreach (ErrorInfo indexedError in result.Errors)
    {
        Console.WriteLine($"Failed to import user: {indexedError.Reason}");
    }
}
catch (FirebaseAuthException e)
{
    Console.WriteLine($"Error importing users: {e.Message}");
}

HMAC হ্যাশ করা পাসওয়ার্ড সহ ব্যবহারকারীদের ইমপোর্ট করা

HMAC হ্যাশিং অ্যালগরিদমের মধ্যে এগুলি অন্তর্ভুক্ত: HMAC_MD5, HMAC_SHA1, HMAC_SHA256 এবং HMAC_SHA512. এইসব হ্যাশিং অ্যালগরিদমের জন্য, আপনাকে অবশ্যই হ্যাশ সাইনার কী প্রদান করতে হবে।

Node.js

getAuth()
  .importUsers(
    [
      {
        uid: 'some-uid',
        email: 'user@example.com',
        // Must be provided in a byte buffer.
        passwordHash: Buffer.from('password-hash'),
        // Must be provided in a byte buffer.
        passwordSalt: Buffer.from('salt'),
      },
    ],
    {
      hash: {
        algorithm: 'HMAC_SHA256',
        // Must be provided in a byte buffer.
        key: Buffer.from('secret'),
      },
    }
  )
  .then((results) => {
    results.errors.forEach((indexedError) => {
      console.log(`Error importing user ${indexedError.index}`);
    });
  })
  .catch((error) => {
    console.log('Error importing users :', error);
  });

জাভা

try {
  List<ImportUserRecord> users = Collections.singletonList(ImportUserRecord.builder()
      .setUid("some-uid")
      .setEmail("user@example.com")
      .setPasswordHash("password-hash".getBytes())
      .setPasswordSalt("salt".getBytes())
      .build());
  UserImportOptions options = UserImportOptions.withHash(
      HmacSha256.builder()
          .setKey("secret".getBytes())
          .build());
  UserImportResult result = FirebaseAuth.getInstance().importUsers(users, options);
  for (ErrorInfo indexedError : result.getErrors()) {
    System.out.println("Failed to import user: " + indexedError.getReason());
  }
} catch (FirebaseAuthException e) {
  System.out.println("Error importing users: " + e.getMessage());
}

Python

users = [
    auth.ImportUserRecord(
        uid='some-uid',
        email='user@example.com',
        password_hash=b'password_hash',
        password_salt=b'salt'
    ),
]

hash_alg = auth.UserImportHash.hmac_sha256(key=b'secret')
try:
    result = auth.import_users(users, hash_alg=hash_alg)
    for err in result.errors:
        print('Failed to import user:', err.reason)
except exceptions.FirebaseError as error:
    print('Error importing users:', error)

Go

users := []*auth.UserToImport{
	(&auth.UserToImport{}).
		UID("some-uid").
		Email("user@example.com").
		PasswordHash([]byte("password-hash")).
		PasswordSalt([]byte("salt")),
}
h := hash.HMACSHA256{
	Key: []byte("secret"),
}
result, err := client.ImportUsers(ctx, users, auth.WithHash(h))
if err != nil {
	log.Fatalln("Error importing users", err)
}
for _, e := range result.Errors {
	log.Println("Failed to import user", e.Reason)
}

C#

try
{
    var users = new List<ImportUserRecordArgs>()
    {
        new ImportUserRecordArgs()
        {
            Uid = "some-uid",
            Email = "user@example.com",
            PasswordHash = Encoding.ASCII.GetBytes("password-hash"),
            PasswordSalt = Encoding.ASCII.GetBytes("salt"),
        },
    };

    var options = new UserImportOptions()
    {
        Hash = new HmacSha256()
        {
            Key = Encoding.ASCII.GetBytes("secret"),
        },
    };

    UserImportResult result = await FirebaseAuth.DefaultInstance.ImportUsersAsync(users, options);
    foreach (ErrorInfo indexedError in result.Errors)
    {
        Console.WriteLine($"Failed to import user: {indexedError.Reason}");
    }
}
catch (FirebaseAuthException e)
{
    Console.WriteLine($"Error importing users: {e.Message}");
}

MD5, SHA ও PBKDF হ্যাশ করা পাসওয়ার্ড সহ ব্যবহারকারীদের ইমপোর্ট করা

MD5, SHA এবং PBKDF হ্যাশিং অ্যালগরিদমের মধ্যে এগুলি অন্তর্ভুক্ত: MD5, SHA1, SHA256, SHA512, PBKDF_SHA1 এবং PBKDF2_SHA256. এইসব হ্যাশিং অ্যালগরিদমের জন্য, আপনাকে অবশ্যই রাউন্ডের সংখ্যা (MD5-এর জন্য ০ থেকে ৮১৯২, SHA1, SHA256 ও SHA512-এর জন্য ১ থেকে ৮১৯২ এবং PBKDF_SHA1 ও PBKDF2_SHA256-এর জন্য ০ থেকে ১২০০০০) দিতে হবে যা পাসওয়ার্ড হ্যাশ করার জন্য মূলতঃ ব্যবহার করা হয়েছে। যদি একটি সিঙ্গেল হ্যাশিং ফাংশন মূলত প্রয়োগ করা হয়, তাহলে রাউন্ড ১ হিসেবে সেট করতে হবে।

Node.js

getAuth()
  .importUsers(
    [
      {
        uid: 'some-uid',
        email: 'user@example.com',
        // Must be provided in a byte buffer.
        passwordHash: Buffer.from('password-hash'),
        // Must be provided in a byte buffer.
        passwordSalt: Buffer.from('salt'),
      },
    ],
    {
      hash: {
        algorithm: 'PBKDF2_SHA256',
        rounds: 100000,
      },
    }
  )
  .then((results) => {
    results.errors.forEach((indexedError) => {
      console.log(`Error importing user ${indexedError.index}`);
    });
  })
  .catch((error) => {
    console.log('Error importing users :', error);
  });

জাভা

try {
  List<ImportUserRecord> users = Collections.singletonList(ImportUserRecord.builder()
      .setUid("some-uid")
      .setEmail("user@example.com")
      .setPasswordHash("password-hash".getBytes())
      .setPasswordSalt("salt".getBytes())
      .build());
  UserImportOptions options = UserImportOptions.withHash(
      Pbkdf2Sha256.builder()
          .setRounds(100000)
          .build());
  UserImportResult result = FirebaseAuth.getInstance().importUsers(users, options);
  for (ErrorInfo indexedError : result.getErrors()) {
    System.out.println("Failed to import user: " + indexedError.getReason());
  }
} catch (FirebaseAuthException e) {
  System.out.println("Error importing users: " + e.getMessage());
}

Python

users = [
    auth.ImportUserRecord(
        uid='some-uid',
        email='user@example.com',
        password_hash=b'password_hash',
        password_salt=b'salt'
    ),
]

hash_alg = auth.UserImportHash.pbkdf2_sha256(rounds=100000)
try:
    result = auth.import_users(users, hash_alg=hash_alg)
    for err in result.errors:
        print('Failed to import user:', err.reason)
except exceptions.FirebaseError as error:
    print('Error importing users:', error)

Go

users := []*auth.UserToImport{
	(&auth.UserToImport{}).
		UID("some-uid").
		Email("user@example.com").
		PasswordHash([]byte("password-hash")).
		PasswordSalt([]byte("salt")),
}
h := hash.PBKDF2SHA256{
	Rounds: 100000,
}
result, err := client.ImportUsers(ctx, users, auth.WithHash(h))
if err != nil {
	log.Fatalln("Error importing users", err)
}
for _, e := range result.Errors {
	log.Println("Failed to import user", e.Reason)
}

C#

try
{
    var users = new List<ImportUserRecordArgs>()
    {
        new ImportUserRecordArgs()
        {
            Uid = "some-uid",
            Email = "user@example.com",
            PasswordHash = Encoding.ASCII.GetBytes("password-hash"),
            PasswordSalt = Encoding.ASCII.GetBytes("salt"),
        },
    };

    var options = new UserImportOptions()
    {
        Hash = new Pbkdf2Sha256()
        {
            Rounds = 100000,
        },
    };

    UserImportResult result = await FirebaseAuth.DefaultInstance.ImportUsersAsync(users, options);
    foreach (ErrorInfo indexedError in result.Errors)
    {
        Console.WriteLine($"Failed to import user: {indexedError.Reason}");
    }
}
catch (FirebaseAuthException e)
{
    Console.WriteLine($"Error importing users: {e.Message}");
}

BCRYPT হ্যাশ করা পাসওয়ার্ড সহ ব্যবহারকারীদের ইমপোর্ট করা

BCRYPT হ্যাশ করা পাসওয়ার্ডের জন্য, অতিরিক্ত হ্যাশ প্যারামিটার বা ব্যবহারকারী পিছু পাসওয়ার্ড সল্ট কোনওটিই প্রয়োজন হয় না।

Node.js

getAuth()
  .importUsers(
    [
      {
        uid: 'some-uid',
        email: 'user@example.com',
        // Must be provided in a byte buffer.
        passwordHash: Buffer.from('password-hash'),
      },
    ],
    {
      hash: {
        algorithm: 'BCRYPT',
      },
    }
  )
  .then((results) => {
    results.errors.forEach((indexedError) => {
      console.log(`Error importing user ${indexedError.index}`);
    });
  })
  .catch((error) => {
    console.log('Error importing users :', error);
  });

জাভা

try {
  List<ImportUserRecord> users = Collections.singletonList(ImportUserRecord.builder()
      .setUid("some-uid")
      .setEmail("user@example.com")
      .setPasswordHash("password-hash".getBytes())
      .setPasswordSalt("salt".getBytes())
      .build());
  UserImportOptions options = UserImportOptions.withHash(Bcrypt.getInstance());
  UserImportResult result = FirebaseAuth.getInstance().importUsers(users, options);
  for (ErrorInfo indexedError : result.getErrors()) {
    System.out.println("Failed to import user: " + indexedError.getReason());
  }
} catch (FirebaseAuthException e) {
  System.out.println("Error importing users: " + e.getMessage());
}

Python

users = [
    auth.ImportUserRecord(
        uid='some-uid',
        email='user@example.com',
        password_hash=b'password_hash',
        password_salt=b'salt'
    ),
]

hash_alg = auth.UserImportHash.bcrypt()
try:
    result = auth.import_users(users, hash_alg=hash_alg)
    for err in result.errors:
        print('Failed to import user:', err.reason)
except exceptions.FirebaseError as error:
    print('Error importing users:', error)

Go

users := []*auth.UserToImport{
	(&auth.UserToImport{}).
		UID("some-uid").
		Email("user@example.com").
		PasswordHash([]byte("password-hash")).
		PasswordSalt([]byte("salt")),
}
h := hash.Bcrypt{}
result, err := client.ImportUsers(ctx, users, auth.WithHash(h))
if err != nil {
	log.Fatalln("Error importing users", err)
}
for _, e := range result.Errors {
	log.Println("Failed to import user", e.Reason)
}

C#

try
{
    var users = new List<ImportUserRecordArgs>()
    {
        new ImportUserRecordArgs()
        {
            Uid = "some-uid",
            Email = "user@example.com",
            PasswordHash = Encoding.ASCII.GetBytes("password-hash"),
            PasswordSalt = Encoding.ASCII.GetBytes("salt"),
        },
    };

    var options = new UserImportOptions()
    {
        Hash = new Bcrypt(),
    };

    UserImportResult result = await FirebaseAuth.DefaultInstance.ImportUsersAsync(users, options);
    foreach (ErrorInfo indexedError in result.Errors)
    {
        Console.WriteLine($"Failed to import user: {indexedError.Reason}");
    }
}
catch (FirebaseAuthException e)
{
    Console.WriteLine($"Error importing users: {e.Message}");
}

Argon2 হ্যাশ করা পাসওয়ার্ড সহ ব্যবহারকারীদের ইমপোর্ট করা

আপনি Argon2 হ্যাশ অবজেক্ট তৈরি করে Argon2 হ্যাশ করা পাসওয়ার্ড সহ ব্যবহারকারীর রেকর্ড ইমপোর্ট করতে পারবেন। মনে রাখবেন, এটি বর্তমানে শুধুমাত্র অ্যাডমিন Java SDK-তে কাজ করে।

এই অ্যালগরিদমের জন্য হ্যাশ বিকল্প তৈরি করতে প্রয়োজনীয় প্যারামিটারগুলির মধ্যে এগুলি অন্তর্ভুক্ত:

  • hashLengthBytes: বাইট হিসেবে কাঙ্ক্ষিত হ্যাশ দৈর্ঘ্য, পূর্ণসংখ্যা হিসেবে প্রদান করা হয়
  • hashType: ব্যবহার করার জন্য Argon2 ভেরিয়েন্ট (ARGON2_D, ARGON2_ID, ARGON2_I)
  • parallelism: প্যারালালিজমের ডিগ্রি, যা একটি পূর্ণসংখ্যা হিসেবে প্রদান করা হয়। ১ থেকে ১৬-এর মধ্যে হতে হবে (দুটি সংখ্যাই অন্তর্ভুক্ত)
  • iterations: পারফর্ম করার জন্য ইটারেশনের সংখ্যা, যা একটি পূর্ণসংখ্যা হিসেবে প্রদান করা হয়। ১ থেকে ১৬-এর মধ্যে হতে হবে (দুটি সংখ্যাই অন্তর্ভুক্ত)
  • memoryCostKib: এই অ্যালগরিদমের জন্য প্রয়োজনীয় মেমরি খরচ কিবিবাইটে হতে হবে এবং তা অবশ্যই ৩২, ৭৬৮-এর কম হতে হবে।
  • version: Argon2 অ্যালগরিদমের ভার্সন (VERSION_10 বা VERSION_13)। ঐচ্ছিক, উল্লেখ করা না থাকলে ডিফল্ট হিসেবে VERSION_13 সেট করা হয়।
  • associatedData: অতিরিক্ত সংশ্লিষ্ট ডেটা, বাইট অ্যারে হিসেবে প্রদান করা হয়, যা সুরক্ষার অতিরিক্ত স্তর প্রদান করতে হ্যাশ ভ্যালুর সাথে যুক্ত করা হয়। ঐচ্ছিক, API-তে পাঠানোর আগে এই ডেটা Base64 এনকোড করা হয়।

জাভা

try {
  List<ImportUserRecord> users = Collections.singletonList(ImportUserRecord.builder()
      .setUid("some-uid")
      .setEmail("user@example.com")
      .setPasswordHash("password-hash".getBytes())
      .setPasswordSalt("salt".getBytes())
      .build());
  UserImportOptions options = UserImportOptions.withHash(
      Argon2.builder()
          .setHashLengthBytes(512)
          .setHashType(Argon2HashType.ARGON2_ID)
          .setParallelism(8)
          .setIterations(16)
          .setMemoryCostKib(2048)
          .setVersion(Argon2Version.VERSION_10)
          .setAssociatedData("associated-data".getBytes())
          .build());
  UserImportResult result = FirebaseAuth.getInstance().importUsers(users, options);
  for (ErrorInfo indexedError : result.getErrors()) {
    System.out.println("Failed to import user: " + indexedError.getReason());
  }
} catch (FirebaseAuthException e) {
  System.out.println("Error importing users: " + e.getMessage());
}

পাসওয়ার্ড ছাড়া ব্যবহারকারী ইমপোর্ট করা

আপনি পাসওয়ার্ড ছাড়াই ব্যবহারকারীদের ইমপোর্ট করতে পারবেন। পাসওয়ার্ড নেই এমন ব্যবহারকারীদের OAuth প্রদানকারী, কাস্টম দাবি ও ফোন নম্বর আছে এমন ব্যবহারকারীদের সাথে ইমপোর্ট করা যেতে পারে।

Node.js

getAuth()
  .importUsers([
    {
      uid: 'some-uid',
      displayName: 'John Doe',
      email: 'johndoe@gmail.com',
      photoURL: 'http://www.example.com/12345678/photo.png',
      emailVerified: true,
      phoneNumber: '+11234567890',
      // Set this user as admin.
      customClaims: { admin: true },
      // User with Google provider.
      providerData: [
        {
          uid: 'google-uid',
          email: 'johndoe@gmail.com',
          displayName: 'John Doe',
          photoURL: 'http://www.example.com/12345678/photo.png',
          providerId: 'google.com',
        },
      ],
    },
  ])
  .then((results) => {
    results.errors.forEach((indexedError) => {
      console.log(`Error importing user ${indexedError.index}`);
    });
  })
  .catch((error) => {
    console.log('Error importing users :', error);
  });

জাভা

try {
  List<ImportUserRecord> users = Collections.singletonList(ImportUserRecord.builder()
      .setUid("some-uid")
      .setDisplayName("John Doe")
      .setEmail("johndoe@gmail.com")
      .setPhotoUrl("http://www.example.com/12345678/photo.png")
      .setEmailVerified(true)
      .setPhoneNumber("+11234567890")
      .putCustomClaim("admin", true) // set this user as admin
      .addUserProvider(UserProvider.builder() // user with Google provider
          .setUid("google-uid")
          .setEmail("johndoe@gmail.com")
          .setDisplayName("John Doe")
          .setPhotoUrl("http://www.example.com/12345678/photo.png")
          .setProviderId("google.com")
          .build())
      .build());
  UserImportResult result = FirebaseAuth.getInstance().importUsers(users);
  for (ErrorInfo indexedError : result.getErrors()) {
    System.out.println("Failed to import user: " + indexedError.getReason());
  }
} catch (FirebaseAuthException e) {
  System.out.println("Error importing users: " + e.getMessage());
}

Python

users = [
    auth.ImportUserRecord(
        uid='some-uid',
        display_name='John Doe',
        email='johndoe@gmail.com',
        photo_url='http://www.example.com/12345678/photo.png',
        email_verified=True,
        phone_number='+11234567890',
        custom_claims={'admin': True}, # set this user as admin
        provider_data=[ # user with Google provider
            auth.UserProvider(
                uid='google-uid',
                email='johndoe@gmail.com',
                display_name='John Doe',
                photo_url='http://www.example.com/12345678/photo.png',
                provider_id='google.com'
            )
        ],
    ),
]
try:
    result = auth.import_users(users)
    for err in result.errors:
        print('Failed to import user:', err.reason)
except exceptions.FirebaseError as error:
    print('Error importing users:', error)

Go

users := []*auth.UserToImport{
	(&auth.UserToImport{}).
		UID("some-uid").
		DisplayName("John Doe").
		Email("johndoe@gmail.com").
		PhotoURL("http://www.example.com/12345678/photo.png").
		EmailVerified(true).
		PhoneNumber("+11234567890").
		CustomClaims(map[string]interface{}{"admin": true}). // set this user as admin
		ProviderData([]*auth.UserProvider{                   // user with Google provider
			{
				UID:         "google-uid",
				Email:       "johndoe@gmail.com",
				DisplayName: "John Doe",
				PhotoURL:    "http://www.example.com/12345678/photo.png",
				ProviderID:  "google.com",
			},
		}),
}
result, err := client.ImportUsers(ctx, users)
if err != nil {
	log.Fatalln("Error importing users", err)
}
for _, e := range result.Errors {
	log.Println("Failed to import user", e.Reason)
}

C#

try
{
    var users = new List<ImportUserRecordArgs>()
    {
        new ImportUserRecordArgs()
        {
            Uid = "some-uid",
            DisplayName = "John Doe",
            Email = "johndoe@gmail.com",
            PhotoUrl = "http://www.example.com/12345678/photo.png",
            EmailVerified = true,
            PhoneNumber = "+11234567890",
            CustomClaims = new Dictionary<string, object>()
            {
                { "admin", true }, // set this user as admin
            },
            UserProviders = new List<UserProvider>
            {
                new UserProvider() // user with Google provider
                {
                    Uid = "google-uid",
                    Email = "johndoe@gmail.com",
                    DisplayName = "John Doe",
                    PhotoUrl = "http://www.example.com/12345678/photo.png",
                    ProviderId = "google.com",
                },
            },
        },
    };

    UserImportResult result = await FirebaseAuth.DefaultInstance.ImportUsersAsync(users);
    foreach (ErrorInfo indexedError in result.Errors)
    {
        Console.WriteLine($"Failed to import user: {indexedError.Reason}");
    }
}
catch (FirebaseAuthException e)
{
    Console.WriteLine($"Error importing users: {e.Message}");
}