ফায়ারবেস অ্যাডমিন এসডিকে, উন্নত বিশেষাধিকার সহ Firebase Authentication একসাথে অনেক ব্যবহারকারী ইম্পোর্ট করার জন্য Auth.importUsers() এপিআই প্রদান করে। যদিও এই ফিচারটি ফায়ারবেস সিএলআই- তেও পাওয়া যায়, অ্যাডমিন এসডিকে আপনাকে কোনো মধ্যবর্তী CSV বা JSON ফাইল তৈরি না করেই, একটি বাহ্যিক অথেনটিকেশন সিস্টেম বা অন্য ফায়ারবেস প্রজেক্ট থেকে বিদ্যমান ব্যবহারকারীদের প্রোগ্রাম্যাটিকভাবে আপলোড করার সুযোগ দেয়।
ব্যবহারকারী ইম্পোর্ট এপিআই নিম্নলিখিত সুবিধাগুলো প্রদান করে:
- ভিন্ন পাসওয়ার্ড হ্যাশিং অ্যালগরিদম ব্যবহার করে এমন একটি বাহ্যিক প্রমাণীকরণ সিস্টেম থেকে ব্যবহারকারীদের স্থানান্তর করার ক্ষমতা।
- অন্য ফায়ারবেস প্রজেক্ট থেকে ব্যবহারকারীদের স্থানান্তর করার ক্ষমতা।
- দ্রুত এবং কার্যকরভাবে বিপুল সংখ্যক ডেটা আমদানির কার্যক্রমের জন্য অপ্টিমাইজেশন। এই প্রক্রিয়াটি
uid),email,phoneNumberবা অন্যান্য শনাক্তকারীর পুনরাবৃত্তি যাচাই না করেই ব্যবহারকারীদের তথ্য প্রক্রিয়াকরণ করে। - বিদ্যমান OAuth ব্যবহারকারীদের (Google, Facebook, ইত্যাদি) স্থানান্তর করার বা নতুন ব্যবহারকারী তৈরি করার ক্ষমতা।
- কাস্টম ক্লেইম সহ ব্যবহারকারীদের সরাসরি এবং একসাথে ইম্পোর্ট করার সুবিধা।
ব্যবহার
একটিমাত্র এপিআই কলে সর্বোচ্চ ১০০০ জন ব্যবহারকারীকে ইম্পোর্ট করা যায়। উল্লেখ্য যে, এই অপারেশনটি গতির জন্য অপ্টিমাইজ করা হয়েছে এবং এটি uid , email , phoneNumber এবং অন্যান্য অনন্য শনাক্তকারীর পুনরাবৃত্তি পরীক্ষা করে না। কোনো ব্যবহারকারীকে ইম্পোর্ট করার সময় যদি তার ইউআইডি বিদ্যমান কোনো uid সাথে মিলে যায়, তবে সেই বিদ্যমান ব্যবহারকারীটি প্রতিস্থাপিত হয়ে যাবে। অন্য কোনো ফিল্ডের (যেমন email ) পুনরাবৃত্তি সহ কোনো ব্যবহারকারীকে ইম্পোর্ট করলে, একই মান সহ একজন অতিরিক্ত ব্যবহারকারী তৈরি হবে। ফলস্বরূপ, যখন আপনি এই এপিআই ব্যবহার করবেন, তখন আপনাকে অবশ্যই নিশ্চিত করতে হবে যে আপনি কোনো অনন্য ফিল্ডের পুনরাবৃত্তি করছেন না।
নোড.জেএস
// 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());
পাইথন
# 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'
),
]
যান
// 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")))
সি#
// 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 Authentication ব্যবহার করে সাইন ইন করার চেষ্টা করলে ফায়ারবেস তাদের নিরাপদে প্রমাণীকরণ করতে পারে। সফলভাবে সাইন-ইন করার পর, ফায়ারবেস তার নিজস্ব হ্যাশিং অ্যালগরিদম দিয়ে ব্যবহারকারীর পাসওয়ার্ডটি পুনরায় হ্যাশ করে। নিচে প্রতিটি অ্যালগরিদমের জন্য প্রয়োজনীয় ফিল্ডগুলো সম্পর্কে আরও জানুন।
ব্যবহারকারী-নির্দিষ্ট কোনো ত্রুটি ঘটলেও Firebase Authentication প্রদত্ত ব্যবহারকারীদের সম্পূর্ণ তালিকা আপলোড করার চেষ্টা করে। এই অপারেশনটি সফল এবং ব্যর্থ ইম্পোর্টগুলোর সারসংক্ষেপসহ একটি ফলাফল প্রদান করে। প্রতিটি ব্যর্থ ব্যবহারকারী ইম্পোর্টের জন্য ত্রুটির বিস্তারিত বিবরণ দেখানো হয়।
নোড.জেএস
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.
}
পাইথন
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
যান
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)
}
সি#
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 ইউজার ইত্যাদি), তাহলে হ্যাশিং অপশন প্রদান করবেন না।
ফায়ারবেস স্ক্রিপ্ট হ্যাশ করা পাসওয়ার্ড ব্যবহার করে ব্যবহারকারীদের ইম্পোর্ট করুন
ডিফল্টরূপে, ফায়ারবেস পাসওয়ার্ড সংরক্ষণের জন্য স্ক্রিপ্ট (scrypt) হ্যাশিং অ্যালগরিদমের একটি পরিবর্তিত ফায়ারবেস সংস্করণ ব্যবহার করে। অন্য কোনো বিদ্যমান ফায়ারবেস প্রজেক্ট থেকে ব্যবহারকারীদের স্থানান্তরের জন্য পরিবর্তিত স্ক্রিপ্ট দিয়ে হ্যাশ করা পাসওয়ার্ড ইম্পোর্ট করা উপযোগী। এটি করার জন্য, মূল প্রজেক্টটির অভ্যন্তরীণ প্যারামিটারগুলো নির্ধারণ করতে হবে।
ফায়ারবেস প্রতিটি প্রজেক্টের জন্য স্বতন্ত্র পাসওয়ার্ড হ্যাশ প্যারামিটার তৈরি করে। এই প্যারামিটারগুলো অ্যাক্সেস করতে, Firebase কনসোলের ইউজার্স (Users ) ট্যাবে যান এবং ব্যবহারকারীদের টেবিল তালিকার উপরের ডানদিকের কোণায় থাকা ড্রপ-ডাউন থেকে পাসওয়ার্ড হ্যাশ প্যারামিটার্স (Password Hash Parameters) নির্বাচন করুন।
এই অ্যালগরিদমের হ্যাশ অপশনগুলো তৈরি করার জন্য প্রয়োজনীয় প্যারামিটারগুলো হলো:
-
key: স্বাক্ষরকারীর কী, যা সাধারণত base64 এনকোডিং-এ প্রদান করা হয়। -
saltSeparator: লবণ বিভাজক যা সাধারণত base64 এনকোডিং-এ সরবরাহ করা হয় (ঐচ্ছিক)। -
rounds: পাসওয়ার্ড হ্যাশ করতে ব্যবহৃত রাউন্ডের সংখ্যা। memoryCost: এই অ্যালগরিদমটির জন্য প্রয়োজনীয় মেমরি খরচ।
নোড.জেএস
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());
}
পাইথন
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)
যান
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)
}
সি#
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}");
}
স্ট্যান্ডার্ড স্ক্রিপ্ট হ্যাশ করা পাসওয়ার্ড সহ ব্যবহারকারীদের ইম্পোর্ট করুন
Firebase Authentication স্ট্যান্ডার্ড স্ক্রিপ্ট অ্যালগরিদম এবং এর পরিবর্তিত সংস্করণ (উপরে উল্লিখিত) উভয়কেই সমর্থন করে। স্ট্যান্ডার্ড স্ক্রিপ্ট অ্যালগরিদমের জন্য নিম্নলিখিত হ্যাশিং প্যারামিটারগুলো প্রয়োজন:
-
memoryCost: হ্যাশিং অ্যালগরিদমের সিপিইউ/মেমরি খরচ। -
parallelization: হ্যাশিং অ্যালগরিদমের সমান্তরালকরণ। -
blockSize: হ্যাশিং অ্যালগরিদমের ব্লক সাইজ (সাধারণত ৮)। derivedKeyLength: হ্যাশিং অ্যালগরিদমের প্রাপ্ত কী-এর দৈর্ঘ্য
নোড.জেএস
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());
}
পাইথন
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)
যান
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)
}
সি#
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 । এই হ্যাশিং অ্যালগরিদমগুলোর জন্য আপনাকে অবশ্যই হ্যাশ সাইনার কী প্রদান করতে হবে।
নোড.জেএস
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());
}
পাইথন
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)
যান
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)
}
সি#
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 এর জন্য ০ থেকে ১২০০০০-এর মধ্যে)। যদি প্রাথমিকভাবে একটিমাত্র হ্যাশিং ফাংশন প্রয়োগ করা হয়ে থাকে, তবে রাউন্ডের সংখ্যা অবশ্যই ১ সেট করতে হবে।
নোড.জেএস
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());
}
পাইথন
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)
যান
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)
}
সি#
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 হ্যাশ করা পাসওয়ার্ডের ক্ষেত্রে, প্রতি ব্যবহারকারীর জন্য অতিরিক্ত হ্যাশ প্যারামিটার বা পাসওয়ার্ড সল্ট-এর প্রয়োজন হয় না।
নোড.জেএস
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());
}
পাইথন
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)
যান
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)
}
সি#
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 হ্যাশ করা পাসওয়ার্ডযুক্ত ব্যবহারকারীর রেকর্ড ইম্পোর্ট করতে পারেন। উল্লেখ্য যে, এটি বর্তমানে শুধুমাত্র অ্যাডমিন জাভা এসডিকে-তে সমর্থিত।
এই অ্যালগরিদমের হ্যাশ অপশনগুলো তৈরি করার জন্য প্রয়োজনীয় প্যারামিটারগুলো হলো:
-
hashLengthBytes: বাইটে কাঙ্ক্ষিত হ্যাশ দৈর্ঘ্য, যা একটি পূর্ণসংখ্যা হিসাবে প্রদান করতে হবে। -
hashType: ব্যবহৃতব্য Argon2 ভ্যারিয়েন্ট (ARGON2_D,ARGON2_ID,ARGON2_I) -
parallelism: সমান্তরালতার মাত্রা, যা একটি পূর্ণসংখ্যা হিসেবে প্রদান করতে হবে। এর মান অবশ্যই ১ থেকে ১৬-এর মধ্যে হতে হবে (উভয় মানসহ)। -
iterations: সম্পাদন করার জন্য পুনরাবৃত্তির সংখ্যা, যা একটি পূর্ণসংখ্যা হিসাবে প্রদান করতে হবে। মানটি অবশ্যই ১ থেকে ১৬-এর মধ্যে হতে হবে (উভয় মানসহ)। -
memoryCostKib: এই অ্যালগরিদমের জন্য প্রয়োজনীয় মেমরি খরচ কিবিবাইটে, যা অবশ্যই 32768-এর কম হতে হবে। -
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 প্রোভাইডার, কাস্টম ক্লেইম, ফোন নম্বর ইত্যাদি থাকা ব্যবহারকারীদের সাথে একত্রে ইম্পোর্ট করা যায়।
নোড.জেএস
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());
}
পাইথন
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)
যান
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)
}
সি#
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}");
}