Firebase আপনাকে যাচাইকরণের উপর সম্পূর্ণ নিয়ন্ত্রণ দেয়, যার মাধ্যমে আপনি
নিরাপদ JSON ওয়েব টোকেন (JWTs) ব্যবহার করে ব্যবহারকারী বা ডিভাইস যাচাই করতে পারেন। আপনি নিজের সার্ভারে
এইসব টোকেন তৈরি করেন, সেগুলি ক্লায়েন্ট ডিভাইসে ফেরত পাঠান এবং তারপরে signInWithCustomToken() পদ্ধতির মাধ্যমে
যাচাইকরণের জন্য সেগুলি ব্যবহার করেন।
এটি করতে, আপনাকে অবশ্যই একটি সার্ভার এন্ডপয়েন্ট তৈরি করতে হবে যা সাইন-ইন
ক্রেডেনশিয়াল গ্রহণ করে—যেমন ইউজারনেম এবং পাসওয়ার্ড—এবং ক্রেডেনশিয়াল
সঠিক হলে, একটি কাস্টম JWT প্রদান করে। আপনার সার্ভার থেকে ফেরত আসা কাস্টম JWT,
Firebase-এর সাথে যাচাইকরণের জন্য ক্লায়েন্ট ডিভাইস ব্যবহার করতে পারে
(iOS+, Android,
ওয়েব)। যাচাই করা হয়ে গেলে, এই পরিচয়
অন্যান্য Firebase পরিষেবা অ্যাক্সেস করার সময় ব্যবহার করা হবে, যেমন Firebase Realtime Database
এবং Cloud Storage। এছাড়াও, JWT-এর কন্টেন্ট আপনার
Realtime Database Security Rules-এর auth অবজেক্টে এবং
Cloud Storage Security Rules-এর
request.auth অবজেক্টে
উপলভ্য হবে।
আপনি Firebase অ্যাডমিন SDK-এর মাধ্যমে কাস্টম টোকেন তৈরি করতে পারেন অথবা আপনার সার্ভার যদি এমন কোনও ভাষায় লেখা হয় যা Firebase-এ নেটিভভাবে কাজ করে না, তাহলে আপনি থার্ড-পার্টি JWT লাইব্রেরি ব্যবহার করতে পারেন।
শুরু করার আগে
কাস্টম টোকেন হল সাইন করা JWT যেখানে সাইন করার জন্য ব্যবহৃত ব্যক্তিগত কী Google পরিষেবা অ্যাকাউন্টের অন্তর্গত। কাস্টম টোকেন সাইন করার জন্য Firebase অ্যাডমিন SDK-এর ব্যবহার করা উচিত এমন Google পরিষেবা অ্যাকাউন্ট নির্দিষ্ট করার বিভিন্ন উপায় রয়েছে:
- পরিষেবা অ্যাকাউন্ট JSON ফাইল ব্যবহার করা -- এই পদ্ধতি যেকোনও পরিবেশে ব্যবহার করা যেতে পারে, তবে এর জন্য আপনাকে কোডের সাথে একটি পরিষেবা অ্যাকাউন্ট JSON ফাইল প্যাকেজ করতে হবে। পরিষেবা অ্যাকাউন্টের JSON ফাইল যাতে এক্সটার্নাল পার্টির কাছে প্রকাশ না হয়ে যায়, তার জন্য বিশেষ যত্ন নিতে হবে।
- অ্যাডমিন SDK-কে একটি পরিষেবা অ্যাকাউন্ট খুঁজে পেতে দেওয়া -- এই পদ্ধতিটি Google Cloud Functions এবং App Engine-এর মতো Google দ্বারা পরিচালিত পরিবেশে ব্যবহার করা যেতে পারে। আপনাকে হয়ত Google Cloud কনসোলের মাধ্যমে কিছু অতিরিক্ত অনুমতি কনফিগার করতে হবে।
- পরিষেবা অ্যাকাউন্ট আইডি ব্যবহার করা -- Google-পরিচালিত পরিবেশে ব্যবহার করা হলে, এই পদ্ধতি নির্দিষ্ট পরিষেবা অ্যাকাউন্টের কী ব্যবহার করে টোকেন সাইন করবে। তবে, এটি একটি রিমোট ওয়েব পরিষেবা ব্যবহার করে এবং আপনাকে Google Cloud কনসোলের মাধ্যমে এই পরিষেবা অ্যাকাউন্টের জন্য অতিরিক্ত অনুমতি কনফিগার করতে হতে পারে।
পরিষেবা অ্যাকাউন্ট JSON ফাইল ব্যবহার করা
পরিষেবা অ্যাকাউন্টের JSON ফাইলে পরিষেবা অ্যাকাউন্টের সাথে সম্পর্কিত সব তথ্য (RSA ব্যক্তিগত কী সহ) থাকে। Firebase কনসোল থেকে সেগুলি ডাউনলোড করা যাবে। পরিষেবা অ্যাকাউন্ট JSON ফাইলের মাধ্যমে কীভাবে অ্যাডমিন SDK শুরু করবেন সেই সম্পর্কে আরও তথ্যের জন্য অ্যাডমিন SDK সেট-আপ করার নির্দেশাবলী অনুসরণ করুন।
এই পদ্ধতিতে ইনিশিয়ালাইজ করা হলে তা বিভিন্ন ধরনের Admin SDK ডেপ্লয়মেন্টের ক্ষেত্রে উপযুক্ত হয়। এছাড়াও, এটি অ্যাডমিন SDK-কে কোনও রিমোট API কল না করেই, লোকালভাবে কাস্টম টোকেন তৈরি ও সাইন করার সুবিধা দেয়। এই পদ্ধতির প্রধান অসুবিধা হল, আপনার কোডের সাথে পরিষেবা অ্যাকাউন্টের JSON ফাইল প্যাকেজ করতে হবে। এছাড়াও মনে রাখবেন যে, পরিষেবা অ্যাকাউন্টের JSON ফাইলে থাকা ব্যক্তিগত কী হল সংবেদনশীল তথ্য এবং এটি গোপন রাখার জন্য বিশেষ যত্ন নিতে হবে। বিশেষ করে, পাবলিক ভার্সন কন্ট্রোলে পরিষেবা অ্যাকাউন্টের JSON ফাইল যোগ করা থেকে বিরত থাকুন।
অ্যাডমিন SDK-কে একটি পরিষেবা অ্যাকাউন্ট খুঁজে পেতে দেওয়া
আপনার কোড Google-এর ম্যানেজ করা পরিবেশে ডিপ্লয় করা হলে, অ্যাডমিন SDK কাস্টম টোকেন সাইন করার উপায় অটোমেটিক খুঁজে নেওয়ার চেষ্টা করতে পারে:
আপনার কোড যদি Java, Python বা Go-এর জন্য App Engine স্ট্যান্ডার্ড এনভায়রনমেন্টে ডিপ্লয় করা হয়, তাহলে অ্যাডমিন SDK কাস্টম টোকেন সাইন করার জন্য সেই এনভায়রনমেন্টে উপস্থিত অ্যাপ আইডেন্টিটি পরিষেবা ব্যবহার করতে পারে। অ্যাপ আইডেন্টিটি পরিষেবা Google App Engine-এর মাধ্যমে আপনার অ্যাপের জন্য প্রদান করা পরিষেবা অ্যাকাউন্ট ব্যবহার করে ডেটা সাইন করে।
আপনার কোড অন্য কোনও ম্যানেজ করা পরিবেশে (যেমন, Google Cloud Functions, Google Compute Engine) ডিপ্লয় করা হলে, Firebase অ্যাডমিন SDK লোকাল মেটাডেটা সার্ভার থেকে অটোমেটিক পরিষেবা অ্যাকাউন্ট আইডি স্ট্রিং খুঁজে নিতে পারে। খুঁজে পাওয়া পরিষেবা অ্যাকাউন্ট আইডি, রিমোট লোকেশন থেকে টোকেন সাইন করার জন্য IAM পরিষেবার সাথে ব্যবহার করা হয়।
এইসব সাইনিং পদ্ধতি ব্যবহার করতে, Google-এর সাথে SDK শুরু করুন অ্যাপ্লিকেশন ডিফল্ট ক্রেডেনশিয়াল এবং কোনও পরিষেবা অ্যাকাউন্ট আইডি স্ট্রিং নির্দিষ্ট করবেন না:
Node.js
initializeApp();
জাভা
FirebaseApp.initializeApp();
Python
default_app = firebase_admin.initialize_app()
Go
app, err := firebase.NewApp(context.Background(), nil)
if err != nil {
log.Fatalf("error initializing app: %v\n", err)
}
C#
FirebaseApp.Create();
লোকালি একই কোড টেস্ট করতে, একটি পরিষেবা অ্যাকাউন্ট JSON ফাইল ডাউনলোড করুন এবং
GOOGLE_APPLICATION_CREDENTIALS এনভায়রনমেন্ট ভেরিয়েবেল সেট করুন যাতে এটি পয়েন্ট করে।
Firebase অ্যাডমিন SDK-কে কোনও পরিষেবা অ্যাকাউন্ট আইডি স্ট্রিং খুঁজে নিতে হলে, আপনার কোড প্রথমবার কাস্টম টোকেন তৈরি করার সময় এটি তা করে। ফলাফল ক্যাশে করা হয় এবং পরবর্তী টোকেন সাইনিং অপারেশনের জন্য আবার ব্যবহার করা হয়। অটোমেটিক শনাক্ত করা পরিষেবা অ্যাকাউন্ট আইডি সাধারণত Google Cloud-এর মাধ্যমে প্রদান করা ডিফল্ট পরিষেবা অ্যাকাউন্টগুলির মধ্যে একটি:
স্পষ্টভাবে উল্লেখ করা পরিষেবা অ্যাকাউন্ট আইডির মতোই, অটোমেটিক শনাক্ত করা পরিষেবা
অ্যাকাউন্ট আইডিতে কাস্টম টোকেন তৈরি করার জন্য
iam.serviceAccounts.signBlob অনুমতি থাকতে হবে। ডিফল্ট পরিষেবা অ্যাকাউন্টকে প্রয়োজনীয় অনুমতি দিতে আপনাকে হয়ত
Google Cloud কনসোলের
IAM ও অ্যাডমিন বিভাগ
ব্যবহার করতে হবে। আরও বিবরণের জন্য নিচে দেওয়া সমস্যার সমাধানকরণ বিভাগ দেখুন।
পরিষেবা অ্যাকাউন্ট আইডি ব্যবহার করা
আপনার অ্যাপ্লিকেশনের বিভিন্ন অংশের মধ্যে সামঞ্জস্য বজায় রাখতে, আপনি একটি পরিষেবা অ্যাকাউন্ট আইডি নির্দিষ্ট করতে পারেন যার কীগুলি Google-পরিচালিত পরিবেশে চালানোর সময় টোকেন সাইন করতে ব্যবহার করা হবে। এটি IAM নীতিকে আরও সহজ ও সুরক্ষিত করতে পারে এবং আপনার কোডে পরিষেবা অ্যাকাউন্ট JSON ফাইল অন্তর্ভুক্ত করার প্রয়োজনীয়তা এড়িয়ে যেতে পারে।
পরিষেবা অ্যাকাউন্ট আইডি
Google Cloud কনসোল,
অথবা ডাউনলোড করা পরিষেবা অ্যাকাউন্ট JSON ফাইলের client_email ফিল্ডে পাওয়া যাবে।
পরিষেবা অ্যাকাউন্ট আইডি হল ইমেল আইডি যা নিম্নলিখিত ফর্ম্যাটে থাকে:
<client-id>@<project-id>.iam.gserviceaccount.com. এগুলি Firebase এবং Google Cloud প্রোজেক্টে
পরিষেবা অ্যাকাউন্ট অনন্যভাবে শনাক্ত করে।
আলাদা পরিষেবা অ্যাকাউন্ট আইডি ব্যবহার করে কাস্টম টোকেন তৈরি করতে, নিচে দেখানো পদ্ধতি অনুযায়ী SDK ইনিশিয়ালাইজ করুন:
Node.js
initializeApp({
serviceAccountId: 'my-client-id@my-project-id.iam.gserviceaccount.com',
});
জাভা
FirebaseOptions options = FirebaseOptions.builder()
.setCredentials(GoogleCredentials.getApplicationDefault())
.setServiceAccountId("my-client-id@my-project-id.iam.gserviceaccount.com")
.build();
FirebaseApp.initializeApp(options);
Python
options = {
'serviceAccountId': 'my-client-id@my-project-id.iam.gserviceaccount.com',
}
firebase_admin.initialize_app(options=options)
Go
conf := &firebase.Config{
ServiceAccountID: "my-client-id@my-project-id.iam.gserviceaccount.com",
}
app, err := firebase.NewApp(context.Background(), conf)
if err != nil {
log.Fatalf("error initializing app: %v\n", err)
}
C#
FirebaseApp.Create(new AppOptions()
{
Credential = GoogleCredential.GetApplicationDefault(),
ServiceAccountId = "my-client-id@my-project-id.iam.gserviceaccount.com",
});
পরিষেবা অ্যাকাউন্ট আইডি সংবেদনশীল তথ্য নয় এবং তাই এটি প্রকাশ হয়ে গেলেও
কোনও ক্ষতি হয় না। তবে, নির্দিষ্ট পরিষেবা অ্যাকাউন্টের মাধ্যমে কাস্টম টোকেন সাইন করতে, Firebase অ্যাডমিন SDK-কে অবশ্যই একটি রিমোট পরিষেবা চালু করতে হবে।
এছাড়াও, আপনাকে অবশ্যই নিশ্চিত করতে হবে যে এই কল করার জন্য অ্যাডমিন SDK যে পরিষেবা অ্যাকাউন্ট ব্যবহার করছে
—সাধারণত {project-name}@appspot.gserviceaccount.com—
তার কাছে iam.serviceAccounts.signBlob
অনুমতি আছে।
আরও বিবরণের জন্য নিচে দেওয়া সমস্যার সমাধানকরণ বিভাগ দেখুন।
Firebase অ্যাডমিন SDK ব্যবহার করে কাস্টম টোকেন তৈরি করা
Firebase অ্যাডমিন SDK-তে কাস্টম টোকেন তৈরি করার জন্য একটি বিল্ট-ইন পদ্ধতি রয়েছে। কমপক্ষে, আপনাকে একটি uid প্রদান করতে হবে, যা যেকোনও স্ট্রিং হতে পারে তবে আপনি যে ব্যবহারকারী বা ডিভাইস যাচাই করছেন
সেটিকে অনন্যভাবে শনাক্ত করতে হবে। এক ঘণ্টা পরে এইসব টোকেনের
মেয়াদ শেষ হয়ে যায়।
Node.js
const uid = 'some-uid';
getAuth()
.createCustomToken(uid)
.then((customToken) => {
// Send token back to client
})
.catch((error) => {
console.log('Error creating custom token:', error);
});
জাভা
String uid = "some-uid";
String customToken = FirebaseAuth.getInstance().createCustomToken(uid);
// Send token back to client
Python
uid = 'some-uid'
custom_token = auth.create_custom_token(uid)
Go
client, err := app.Auth(context.Background())
if err != nil {
log.Fatalf("error getting Auth client: %v\n", err)
}
token, err := client.CustomToken(ctx, "some-uid")
if err != nil {
log.Fatalf("error minting custom token: %v\n", err)
}
log.Printf("Got custom token: %v\n", token)
C#
var uid = "some-uid";
string customToken = await FirebaseAuth.DefaultInstance.CreateCustomTokenAsync(uid);
// Send token back to client
এছাড়াও, আপনি কাস্টম টোকেনে অন্তর্ভুক্ত করার জন্য অতিরিক্ত দাবি নির্দিষ্ট করতে পারেন। যেমন, নিচে, কাস্টম টোকেনে একটি premiumAccount ফিল্ড যোগ করা হয়েছে, যা আপনার নিরাপত্তা নিয়মে auth / request.auth অবজেক্টে উপলভ্য হবে:
Node.js
const userId = 'some-uid';
const additionalClaims = {
premiumAccount: true,
};
getAuth()
.createCustomToken(userId, additionalClaims)
.then((customToken) => {
// Send token back to client
})
.catch((error) => {
console.log('Error creating custom token:', error);
});
জাভা
String uid = "some-uid";
Map<String, Object> additionalClaims = new HashMap<String, Object>();
additionalClaims.put("premiumAccount", true);
String customToken = FirebaseAuth.getInstance()
.createCustomToken(uid, additionalClaims);
// Send token back to client
Python
uid = 'some-uid'
additional_claims = {
'premiumAccount': True
}
custom_token = auth.create_custom_token(uid, additional_claims)
Go
client, err := app.Auth(context.Background())
if err != nil {
log.Fatalf("error getting Auth client: %v\n", err)
}
claims := map[string]interface{}{
"premiumAccount": true,
}
token, err := client.CustomTokenWithClaims(ctx, "some-uid", claims)
if err != nil {
log.Fatalf("error minting custom token: %v\n", err)
}
log.Printf("Got custom token: %v\n", token)
C#
var uid = "some-uid";
var additionalClaims = new Dictionary<string, object>()
{
{ "premiumAccount", true },
};
string customToken = await FirebaseAuth.DefaultInstance
.CreateCustomTokenAsync(uid, additionalClaims);
// Send token back to client
সংরক্ষিত কাস্টম টোকেনের নাম
ক্লায়েন্টে কাস্টম টোকেন ব্যবহার করে সাইন-ইন করুন
কাস্টম টোকেন তৈরি করার পরে, আপনাকে এটি ক্লায়েন্ট অ্যাপে পাঠাতে হবে।
signInWithCustomToken() কল করার মাধ্যমে ক্লায়েন্ট অ্যাপ কাস্টম টোকেন দিয়ে যাচাই করে:
iOS+
Objective-C
[[FIRAuth auth] signInWithCustomToken:customToken
completion:^(FIRAuthDataResult * _Nullable authResult,
NSError * _Nullable error) {
// ...
}];
Swift
Auth.auth().signIn(withCustomToken: customToken ?? "") { user, error in
// ...
}
Android
mAuth.signInWithCustomToken(mCustomToken)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
// Sign in success, update UI with the signed-in user's information
Log.d(TAG, "signInWithCustomToken:success");
FirebaseUser user = mAuth.getCurrentUser();
updateUI(user);
} else {
// If sign in fails, display a message to the user.
Log.w(TAG, "signInWithCustomToken:failure", task.getException());
Toast.makeText(CustomAuthActivity.this, "Authentication failed.",
Toast.LENGTH_SHORT).show();
updateUI(null);
}
}
});
Unity
auth.SignInWithCustomTokenAsync(custom_token).ContinueWith(task => {
if (task.IsCanceled) {
Debug.LogError("SignInWithCustomTokenAsync was canceled.");
return;
}
if (task.IsFaulted) {
Debug.LogError("SignInWithCustomTokenAsync encountered an error: " + task.Exception);
return;
}
Firebase.Auth.AuthResult result = task.Result;
Debug.LogFormat("User signed in successfully: {0} ({1})",
result.User.DisplayName, result.User.UserId);
});
C++
firebase::Future<firebase::auth::AuthResult> result =
auth->SignInWithCustomToken(custom_token);
Web
firebase.auth().signInWithCustomToken(token)
.then((userCredential) => {
// Signed in
var user = userCredential.user;
// ...
})
.catch((error) => {
var errorCode = error.code;
var errorMessage = error.message;
// ...
});
Web
import { getAuth, signInWithCustomToken } from "firebase/auth";
const auth = getAuth();
signInWithCustomToken(auth, token)
.then((userCredential) => {
// Signed in
const user = userCredential.user;
// ...
})
.catch((error) => {
const errorCode = error.code;
const errorMessage = error.message;
// ...
});
যাচাইকরণ সফল হলে, আপনার ব্যবহারকারী এখন কাস্টম টোকেনে অন্তর্ভুক্ত uid দ্বারা নির্দিষ্ট করা অ্যাকাউন্টের মাধ্যমে আপনার ক্লায়েন্ট অ্যাপে সাইন-ইন করবেন। সেই অ্যাকাউন্ট আগে থেকে না থাকলে, সেই ব্যবহারকারীর জন্য একটি রেকর্ড তৈরি করা
হবে।
অন্যান্য সাইন-ইন পদ্ধতির (যেমন
signInWithEmailAndPassword() এবং signInWithCredential()) মতোই, আপনার Realtime Database Security Rules-এ
auth অবজেক্ট
এবং আপনার Cloud Storage Security Rules-এ
request.auth অবজেক্ট
ব্যবহারকারীর uid দিয়ে
ভরে যাবে। এই ক্ষেত্রে, uid হবে সেটি যা
কাস্টম টোকেন তৈরি করার সময় আপনি উল্লেখ করেছেন।
ডেটাবেস সংক্রান্ত নিয়ম
{
"rules": {
"adminContent": {
".read": "auth.uid === 'some-uid'"
}
}
}
স্টোরেজ সংক্রান্ত নিয়ম
service firebase.storage {
match /b/<your-firebase-storage-bucket>/o {
match /adminContent/{filename} {
allow read, write: if request.auth != null && request.auth.uid == "some-uid";
}
}
}
কাস্টম টোকেনে অতিরিক্ত দাবি থাকলে, আপনার নিয়মে auth.token (Firebase Realtime Database) বা request.auth.token
(Cloud Storage) অবজেক্ট থেকে সেগুলির রেফারেন্স দেওয়া যেতে পারে:
ডেটাবেস সংক্রান্ত নিয়ম
{
"rules": {
"premiumContent": {
".read": "auth.token.premiumAccount === true"
}
}
}
স্টোরেজ সংক্রান্ত নিয়ম
service firebase.storage {
match /b/<your-firebase-storage-bucket>/o {
match /premiumContent/{filename} {
allow read, write: if request.auth.token.premiumAccount == true;
}
}
}
থার্ড-পার্টি JWT লাইব্রেরি ব্যবহার করে কাস্টম টোকেন তৈরি করুন
আপনার ব্যাকএন্ড এমন কোনও ভাষায় থাকলে যাতে অফিসিয়াল Firebase অ্যাডমিন SDK নেই, তাহলে আপনি এখনও ম্যানুয়ালি কাস্টম টোকেন তৈরি করতে পারবেন। প্রথমে, আপনার ভাষার জন্য থার্ড-পার্টি JWT লাইব্রেরি খুঁজুন। তারপর, সেই JWT লাইব্রেরি ব্যবহার করে একটি JWT তৈরি করুন যাতে নিম্নলিখিত দাবিগুলি অন্তর্ভুক্ত থাকে:
| কাস্টম টোকেন দাবি | ||
|---|---|---|
alg |
অ্যালগরিদম | "RS256" |
iss |
ইস্যুকারী | আপনার প্রোজেক্টের পরিষেবা অ্যাকাউন্টের ইমেল আইডি |
sub |
বিষয় | আপনার প্রোজেক্টের পরিষেবা অ্যাকাউন্টের ইমেল আইডি |
aud |
দর্শক | "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit" |
iat |
ইস্যু করার সময় | বর্তমান সময়, UNIX epoch থেকে সেকেন্ডে |
exp |
মেয়াদ শেষ হওয়ার সময় |
টোকেনের মেয়াদ শেষ হওয়ার সময়, UNIX epoch থেকে সেকেন্ডে। এটি
iat-এর থেকে সর্বাধিক ৩৬০০ সেকেন্ড পরে হতে পারে।
মনে রাখবেন: এটি শুধুমাত্র সেই সময়কে নিয়ন্ত্রণ করে যখন কাস্টম টোকেন নিজেই শেষ হয়ে যায়। কিন্তু আপনি একবার signInWithCustomToken() ব্যবহার করে কোনও ব্যবহারকারীকে সাইন-ইন করালে, সেশন বাতিল না হওয়া বা ব্যবহারকারী সাইন-আউট না করা পর্যন্ত তিনি ডিভাইসে সাইন-ইন করা অবস্থাতেই থাকবেন।
|
uid |
সাইন-ইন করা ব্যবহারকারীর অনন্য শনাক্তকারী অবশ্যই একটি স্ট্রিং হতে হবে, যার দৈর্ঘ্য
১-১২৮ অক্ষরের মধ্যে হতে হবে। ছোট uid আরও ভালো
পারফর্ম্যান্স অফার করে।
|
|
claims (ঐচ্ছিক) |
নিরাপত্তা সংক্রান্ত নিয়মে অন্তর্ভুক্ত করার জন্য ঐচ্ছিক কাস্টম দাবি auth /
request.auth ভেরিয়েবল
|
|
Firebase অ্যাডমিন SDK-তে কাজ করে না এমন বিভিন্ন ভাষায় কীভাবে কাস্টম টোকেন তৈরি করতে হয় তার কিছু উদাহরণ এখানে দেওয়া হল:
PHP
php-jwt ব্যবহার করে:
// Requires: composer require firebase/php-jwt
use Firebase\JWT\JWT;
// Get your service account's email address and private key from the JSON key file
$service_account_email = "abc-123@a-b-c-123.iam.gserviceaccount.com";
$private_key = "-----BEGIN PRIVATE KEY-----...";
function create_custom_token($uid, $is_premium_account) {
global $service_account_email, $private_key;
$now_seconds = time();
$payload = array(
"iss" => $service_account_email,
"sub" => $service_account_email,
"aud" => "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit",
"iat" => $now_seconds,
"exp" => $now_seconds+(60*60), // Maximum expiration time is one hour
"uid" => $uid,
"claims" => array(
"premium_account" => $is_premium_account
)
);
return JWT::encode($payload, $private_key, "RS256");
}
Ruby
ruby-jwt ব্যবহার করে:
require "jwt"
# Get your service account's email address and private key from the JSON key file
$service_account_email = "service-account@my-project-abc123.iam.gserviceaccount.com"
$private_key = OpenSSL::PKey::RSA.new "-----BEGIN PRIVATE KEY-----\n..."
def create_custom_token(uid, is_premium_account)
now_seconds = Time.now.to_i
payload = {:iss => $service_account_email,
:sub => $service_account_email,
:aud => "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit",
:iat => now_seconds,
:exp => now_seconds+(60*60), # Maximum expiration time is one hour
:uid => uid,
:claims => {:premium_account => is_premium_account}}
JWT.encode payload, $private_key, "RS256"
end
কাস্টম টোকেন তৈরি করার পরে, Firebase-এর মাধ্যমে যাচাই করার জন্য এটি আপনার ক্লায়েন্ট অ্যাপে পাঠান। এটি কীভাবে করতে হয় তা জানতে উপরে দেওয়া কোডের স্যাম্পেল দেখুন।
সমস্যার সমাধান
এই বিভাগে কিছু সাধারণ সমস্যার কথা উল্লেখ করা হয়েছে যা ডেভেলপাররা কাস্টম টোকেন তৈরি করার সময় সম্মুখীন হতে পারেন এবং কীভাবে সেগুলি সমাধান করা যায় তাও উল্লেখ করা হয়েছে।
IAM API চালু করা হয়নি
আপনি যদি টোকেন সাইন করার জন্য কোনও পরিষেবা অ্যাকাউন্ট আইডি নির্দিষ্ট করেন, তাহলে আপনি নিম্নলিখিতটির মতো একটি ত্রুটি পেতে পারেন:
Identity and Access Management (IAM) API has not been used in project 1234567890 before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/iam.googleapis.com/overview?project=1234567890 then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.
Firebase অ্যাডমিন SDK টোকেন সাইন করতে IAM API ব্যবহার করে। এই সমস্যার অর্থ হল, আপনার Firebase প্রোজেক্টের জন্য IAM API বর্তমানে চালু করা নেই। ওয়েব ব্রাউজারে ত্রুটি মেসেজে দেখানো লিঙ্কটি খুলুন এবং আপনার প্রোজেক্টের জন্য API চালু করতে "API চালু করুন" বোতামে ক্লিক করুন।
পরিষেবা অ্যাকাউন্টের প্রয়োজনীয় অনুমতি নেই
Firebase Admin SDK যে পরিষেবা অ্যাকাউন্ট হিসেবে রান করছে, সেটির যদি
iam.serviceAccounts.signBlob অনুমতি না থাকে, তাহলে আপনি নিম্নলিখিত
সমস্যার মেসেজ পেতে পারেন:
Permission iam.serviceAccounts.signBlob is required to perform this operation
on service account projects/-/serviceAccounts/{your-service-account-id}.
এই সমস্যার সমাধান করতে, উপযুক্ত পরিষেবা অ্যাকাউন্টে পরিষেবা অ্যাকাউন্ট টোকেন ক্রিয়েটর IAM ভূমিকা প্রদান করুন। ব্যবহৃত ডিফল্ট পরিষেবা অ্যাকাউন্ট নির্ভর করে এনভায়রনমেন্ট ও Cloud Functions ভার্সনের উপর:
- Cloud Functions (ফার্স্ট জেনারেশন): ডিফল্ট App Engine পরিষেবা অ্যাকাউন্ট ব্যবহার করে।
- Cloud Functions (২য় জেনারেশন): ডিফল্ট Compute Engine পরিষেবা অ্যাকাউন্ট ব্যবহার করে।
Google Cloud কনসোলে, IAM ও অ্যাডমিন বিকল্পে যান।
আপনি যে পরিষেবা অ্যাকাউন্ট আপডেট করতে চান তার পাশে থাকা 'এডিট করুন' আইকনে ক্লিক করুন।
অন্য ভূমিকা যোগ করুন বিকল্পে ক্লিক করুন।
সার্চ ফিল্টারে
"Service Account Token Creator"টাইপ করুন এবং ফলাফল থেকে এটি বেছে নিন।ভূমিকা প্রদান কনফার্ম করতে সেভ করুন বিকল্পে ক্লিক করুন।
এই প্রসেস সম্পর্কে আরও জানতে IAM ডকুমেন্টেশন দেখুন অথবা gcloud কমান্ড-লাইন টুল ব্যবহার করে কীভাবে ভূমিকা আপডেট করতে হয় তা জানুন।
পরিষেবা অ্যাকাউন্ট নির্ধারণ করা যায়নি
আপনি যদি নিম্নলিখিত মেসেজের মতো কোনও সমস্যার মেসেজ পান, তাহলে Firebase Admin SDK সঠিকভাবে শুরু করা হয়নি।
Failed to determine service account ID. Initialize the SDK with service account credentials or specify a service account ID with iam.serviceAccounts.signBlob permission.
আপনি যদি কোনও পরিষেবা অ্যাকাউন্ট আইডি অটোমেটিক খুঁজে পেতে SDK-এর উপর নির্ভর করেন, তাহলে নিশ্চিত করুন কোডটি মেটাডেটা সার্ভার সহ একটি ম্যানেজ করা Google এনভায়রনমেন্টে ডিপ্লয় করা হয়েছে। অন্যথায়, SDK ইনিশিয়ালাইজেশনের সময় পরিষেবা অ্যাকাউন্টের JSON ফাইল বা পরিষেবা অ্যাকাউন্ট আইডি উল্লেখ করতে ভুলবেন না।