Firebase ช่วยให้คุณควบคุมการตรวจสอบสิทธิ์ได้อย่างสมบูรณ์โดยอนุญาตให้คุณตรวจสอบสิทธิ์ผู้ใช้หรืออุปกรณ์โดยใช้ JSON Web Tokens (JWT) ที่ปลอดภัย คุณสร้างโทเค็นเหล่านี้บนเซิร์ฟเวอร์ของคุณส่งกลับไปยังอุปกรณ์ไคลเอนต์จากนั้นใช้เพื่อพิสูจน์ตัวตนผ่าน signInWithCustomToken()
ในการดำเนินการนี้คุณต้องสร้างปลายทางของเซิร์ฟเวอร์ที่ยอมรับข้อมูลรับรองการลงชื่อเข้าใช้เช่นชื่อผู้ใช้และรหัสผ่านและหากข้อมูลรับรองถูกต้องจะส่งคืน JWT ที่กำหนดเอง JWT ที่กำหนดเองที่ส่งคืนจากเซิร์ฟเวอร์ของคุณจะสามารถใช้โดยอุปกรณ์ไคลเอ็นต์เพื่อตรวจสอบสิทธิ์กับ Firebase ( iOS , Android , เว็บ ) เมื่อตรวจสอบสิทธิ์แล้วข้อมูลประจำตัวนี้จะถูกใช้เมื่อเข้าถึงบริการอื่น ๆ ของ Firebase เช่น Firebase Realtime Database และ Cloud Storage นอกจากนี้เนื้อหาของ JWT จะพร้อมใช้งานในออบเจ็กต์ auth
ใน กฎฐานข้อมูลเรียลไทม์ ของคุณและอ็อบเจ็กต์ request.auth
ใน กฎความปลอดภัย ของ Cloud Storage
คุณสามารถสร้างโทเค็นที่กำหนดเองด้วย Firebase Admin SDK หรือใช้ไลบรารี JWT ของบุคคลที่สามได้หากเซิร์ฟเวอร์ของคุณเขียนด้วยภาษาที่ Firebase ไม่รองรับ
ก่อนที่คุณจะเริ่ม
โทเค็นที่กำหนดเองได้รับการลงนาม JWT โดยที่คีย์ส่วนตัวที่ใช้ในการเซ็นชื่อเป็นของบัญชีบริการของ Google มีหลายวิธีในการระบุบัญชีบริการของ Google ที่ Firebase Admin SDK ควรใช้สำหรับการลงนามโทเค็นที่กำหนดเอง:
- การใช้ไฟล์ JSON ของบัญชีบริการ - วิธีนี้สามารถใช้ได้ในทุกสภาพแวดล้อม แต่คุณต้องจัดแพคเกจไฟล์ JSON ของบัญชีบริการพร้อมกับรหัสของคุณ ต้องใช้ความระมัดระวังเป็นพิเศษเพื่อให้แน่ใจว่าไฟล์ JSON ของบัญชีบริการจะไม่เปิดเผยต่อบุคคลภายนอก
- การปล่อยให้ Admin SDK ค้นพบบัญชีบริการ - วิธีนี้สามารถใช้ได้ในสภาพแวดล้อมที่ Google จัดการเช่น Google Cloud Functions และ App Engine คุณอาจต้องกำหนดค่าสิทธิ์เพิ่มเติมบางอย่างผ่าน Google Cloud Console
- การใช้รหัสบัญชีบริการ - เมื่อใช้ในสภาพแวดล้อมที่จัดการโดย Google วิธีนี้จะลงนามโทเค็นโดยใช้รหัสของบัญชีบริการที่ระบุ อย่างไรก็ตามจะใช้บริการเว็บระยะไกลและคุณอาจต้องกำหนดค่าการอนุญาตเพิ่มเติมสำหรับบัญชีบริการนี้ผ่าน Google Cloud Console
ใช้ไฟล์ JSON ของบัญชีบริการ
ไฟล์ JSON ของบัญชีบริการมีข้อมูลทั้งหมดที่เกี่ยวข้องกับบัญชีบริการ (รวมถึงคีย์ส่วนตัว RSA) สามารถดาวน์โหลดได้จากคอนโซล Firebase ทำตาม คำแนะนำในการตั้งค่า Admin SDK สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีเริ่มต้น Admin SDK ด้วยไฟล์ JSON ของบัญชีบริการ
วิธีการเริ่มต้นนี้เหมาะสำหรับการปรับใช้ Admin SDK ที่หลากหลาย นอกจากนี้ยังช่วยให้ Admin SDK สร้างและลงนามโทเค็นที่กำหนดเองในเครื่องโดยไม่ต้องเรียก API จากระยะไกล ข้อเสียเปรียบหลักของวิธีนี้คือคุณต้องจัดแพคเกจไฟล์ JSON ของบัญชีบริการพร้อมกับรหัสของคุณ นอกจากนี้โปรดทราบว่าคีย์ส่วนตัวในไฟล์ JSON ของบัญชีบริการเป็นข้อมูลที่ละเอียดอ่อนและต้องใช้ความระมัดระวังเป็นพิเศษเพื่อเก็บไว้เป็นความลับ โดยเฉพาะอย่างยิ่งอย่าเพิ่มไฟล์ JSON ของบัญชีบริการในการควบคุมเวอร์ชันสาธารณะ
การปล่อยให้ Admin SDK ค้นพบบัญชีบริการ
หากโค้ดของคุณใช้งานได้ในสภาพแวดล้อมที่จัดการโดย Google Admin SDK จะพยายามค้นหาวิธีการลงนามโทเค็นที่กำหนดเองโดยอัตโนมัติ:
หากโค้ดของคุณถูกปรับใช้ในสภาพแวดล้อมมาตรฐาน App Engine สำหรับ Java, Python หรือ Go Admin SDK สามารถใช้ บริการ App Identity ที่ มีอยู่ในสภาพแวดล้อมนั้นเพื่อเซ็นชื่อโทเค็นที่กำหนดเอง บริการ App Identity จะลงนามข้อมูลโดยใช้บัญชีบริการที่ Google App Engine จัดเตรียมไว้ให้สำหรับแอปของคุณ
หากโค้ดของคุณใช้งานได้ในสภาพแวดล้อมที่มีการจัดการอื่น ๆ (เช่น Google Cloud Functions, Google Compute Engine) Firebase Admin SDK จะค้นหาสตริงรหัสบัญชีบริการโดยอัตโนมัติจาก เซิร์ฟเวอร์ข้อมูลเมตาในเครื่อง จากนั้นรหัสบัญชีบริการที่ค้นพบจะใช้ร่วมกับบริการ IAM เพื่อลงนามโทเค็นจากระยะไกล
ในการใช้วิธีการลงนามเหล่านี้ให้เริ่มต้น SDK ด้วยข้อมูลรับรองเริ่มต้นของแอปพลิเคชัน Google และอย่าระบุสตริงรหัสบัญชีบริการ:
โหนด js
admin.initializeApp();
Java
FirebaseApp.initializeApp();
Python
default_app = firebase_admin.initialize_app()
ไป
app, err := firebase.NewApp(context.Background(), nil)
if err != nil {
log.Fatalf("error initializing app: %v\n", err)
}
ค#
FirebaseApp.Create();
หากต้องการทดสอบโค้ดเดียวกันในเครื่องให้ดาวน์โหลดไฟล์ JSON ของบัญชีบริการและตั้งค่าตัวแปรสภาพแวดล้อม GOOGLE_APPLICATION_CREDENTIALS
ให้ชี้ไปที่
หาก Firebase Admin SDK ต้องค้นหาสตริงรหัสบัญชีบริการก็จะทำเช่นนั้นเมื่อโค้ดของคุณสร้างโทเค็นที่กำหนดเองเป็นครั้งแรก ผลลัพธ์จะถูกแคชและใช้ซ้ำสำหรับการดำเนินการเซ็นโทเค็นในภายหลัง รหัสบัญชีบริการที่ค้นพบโดยอัตโนมัติมักเป็นหนึ่งในบัญชีบริการเริ่มต้นที่ Google Cloud มีให้:
เช่นเดียวกับรหัสบัญชีบริการที่ระบุไว้อย่างชัดเจนรหัสบัญชีบริการที่ค้นพบอัตโนมัติต้องมีสิทธิ์ iam.serviceAccounts.signBlob
เพื่อให้การสร้างโทเค็นที่กำหนดเองทำงานได้ คุณอาจต้องใช้ส่วน IAM และผู้ดูแลระบบ ของ Google Cloud Console เพื่อให้สิทธิ์ที่จำเป็นแก่บัญชีบริการเริ่มต้น ดูส่วนการแก้ปัญหาด้านล่างสำหรับรายละเอียดเพิ่มเติม
ใช้รหัสบัญชีบริการ
เพื่อรักษาความสอดคล้องระหว่างส่วนต่างๆของแอปพลิเคชันของคุณคุณสามารถระบุรหัสบัญชีบริการซึ่งจะใช้คีย์เพื่อลงนามโทเค็นเมื่อทำงานในสภาพแวดล้อมที่ Google จัดการ ซึ่งจะทำให้นโยบาย IAM ง่ายขึ้นและปลอดภัยยิ่งขึ้นและหลีกเลี่ยงการรวมไฟล์ JSON ของบัญชีบริการไว้ในโค้ดของคุณ
รหัสบัญชีบริการสามารถพบได้ใน Google Cloud Console หรือในช่อง client_email
ของไฟล์ JSON ของบัญชีบริการที่ดาวน์โหลด รหัสบัญชีบริการคือที่อยู่อีเมลที่มีรูปแบบต่อไปนี้: <client-id>@<project-id>.iam.gserviceaccount.com
พวกเขาระบุบัญชีบริการโดยไม่ซ้ำกันในโครงการ Firebase และ Google Cloud
ในการสร้างโทเค็นที่กำหนดเองโดยใช้รหัสบัญชีบริการแยกต่างหากให้เริ่มต้น SDK ดังที่แสดงด้านล่าง:
โหนด js
admin.initializeApp({
serviceAccountId: 'my-client-id@my-project-id.iam.gserviceaccount.com',
});
Java
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)
ไป
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)
}
ค#
FirebaseApp.Create(new AppOptions()
{
Credential = GoogleCredential.GetApplicationDefault(),
ServiceAccountId = "my-client-id@my-project-id.iam.gserviceaccount.com",
});
รหัสบัญชีบริการไม่ใช่ข้อมูลที่ละเอียดอ่อนดังนั้นการเปิดเผยข้อมูลจึงไม่สำคัญ อย่างไรก็ตามในการลงนามโทเค็นที่กำหนดเองด้วยบัญชีบริการที่ระบุ Firebase Admin SDK ต้องเรียกใช้บริการระยะไกล นอกจากนี้คุณต้องตรวจสอบให้แน่ใจด้วยว่าบัญชีบริการที่ Admin SDK ใช้ในการโทรนี้โดยปกติแล้ว {project-name}@appspot.gserviceaccount.com
- มี สิทธิ์ iam.serviceAccounts.signBlob
ดูส่วนการแก้ปัญหาด้านล่างสำหรับรายละเอียดเพิ่มเติม
สร้างโทเค็นที่กำหนดเองโดยใช้ Firebase Admin SDK
Firebase Admin SDK มีวิธีการในตัวสำหรับการสร้างโทเค็นที่กำหนดเอง อย่างน้อยที่สุดคุณต้องระบุ uid
ซึ่งอาจเป็นสตริงใดก็ได้ แต่ควรระบุผู้ใช้หรืออุปกรณ์ที่คุณกำลังตรวจสอบสิทธิ์โดยไม่ซ้ำกัน โทเค็นเหล่านี้จะหมดอายุหลังจากผ่านไปหนึ่งชั่วโมง
โหนด js
const uid = 'some-uid';
admin
.auth()
.createCustomToken(uid)
.then((customToken) => {
// Send token back to client
})
.catch((error) => {
console.log('Error creating custom token:', error);
});
Java
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)
ไป
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)
ค#
var uid = "some-uid";
string customToken = await FirebaseAuth.DefaultInstance.CreateCustomTokenAsync(uid);
// Send token back to client
คุณยังสามารถระบุการอ้างสิทธิ์เพิ่มเติมที่จะรวมไว้ในโทเค็นที่กำหนดเองได้อีกด้วย ตัวอย่างเช่นด้านล่างมีการเพิ่มฟิลด์ premiumAccount
ลงในโทเค็นที่กำหนดเองซึ่งจะมีอยู่ในออบเจ็กต์ auth
/ request.auth
ในกฎความปลอดภัยของคุณ:
โหนด js
const userId = 'some-uid';
const additionalClaims = {
premiumAccount: true,
};
admin
.auth()
.createCustomToken(userId, additionalClaims)
.then((customToken) => {
// Send token back to client
})
.catch((error) => {
console.log('Error creating custom token:', error);
});
Java
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)
ไป
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)
ค#
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
วัตถุประสงค์ -C
[[FIRAuth auth] signInWithCustomToken:customToken
completion:^(FIRAuthDataResult * _Nullable authResult,
NSError * _Nullable error) {
// ...
}];
รวดเร็ว
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);
}
}
});
ความสามัคคี
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.FirebaseUser newUser = task.Result;
Debug.LogFormat("User signed in successfully: {0} ({1})",
newUser.DisplayName, newUser.UserId);
});
C ++
firebase::Future<firebase::auth::User*> result =
auth->SignInWithCustomToken(custom_token);
เว็บ
firebase.auth().signInWithCustomToken(token)
.then((userCredential) => {
// Signed in
var user = userCredential.user;
// ...
})
.catch((error) => {
var errorCode = error.code;
var errorMessage = error.message;
// ...
});
หากการรับรองความถูกต้องสำเร็จผู้ใช้ของคุณจะลงชื่อเข้าใช้แอปไคลเอ็นต์ของคุณด้วยบัญชีที่ระบุโดย uid
รวมอยู่ในโทเค็นที่กำหนดเอง หากไม่มีบัญชีนั้นมาก่อนระบบจะสร้างเรกคอร์ดสำหรับผู้ใช้นั้น
ในลักษณะเดียวกับวิธีการลงชื่อเข้าใช้อื่น ๆ (เช่น signInWithEmailAndPassword()
และ signInWithCredential()
) ออบเจ็กต์ auth
ใน กฎฐานข้อมูลแบบเรียลไทม์ และอ็อบเจ็กต์ request.auth
ใน กฎความปลอดภัย ของ Cloud Storage จะถูกเติมด้วย 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 Admin SDK อย่างเป็นทางการคุณยังคงสร้างโทเค็นที่กำหนดเองได้ ขั้นแรก ค้นหาไลบรารี JWT ของบุคคลที่สาม สำหรับภาษาของคุณ จากนั้นใช้ไลบรารี JWT นั้นเพื่อสร้าง JWT ซึ่งรวมถึงการอ้างสิทธิ์ต่อไปนี้:
การอ้างสิทธิ์โทเค็นที่กำหนดเอง | ||
---|---|---|
alg | อัลกอริทึม | "RS256" |
iss | ผู้ออก | ที่อยู่อีเมลบัญชีบริการของโครงการของคุณ |
sub | เรื่อง | ที่อยู่อีเมลบัญชีบริการของโครงการของคุณ |
aud | ผู้ชม | "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit" |
iat | ออกในเวลา | เวลาปัจจุบันเป็นวินาทีนับตั้งแต่ยุค UNIX |
exp | เวลาหมดอายุ | เวลาเป็นวินาทีนับตั้งแต่ยุค UNIX ที่โทเค็นหมดอายุ อาจ ช้า กว่า iat ได้ สูงสุด 3600 วินาทีหมายเหตุ: สิ่งนี้จะควบคุมเวลา ที่โทเค็นที่กำหนด เองจะหมดอายุเท่านั้น แต่เมื่อคุณลงชื่อผู้ใช้โดยใช้ signInWithCustomToken() พวกเขาจะยังคงลงชื่อเข้าใช้อุปกรณ์จนกว่าเซสชันของพวกเขาจะไม่ถูกต้องหรือผู้ใช้ออกจากระบบ |
uid | ตัวระบุเฉพาะของผู้ใช้ที่ลงชื่อเข้าใช้ต้องเป็นสตริงที่มีความยาวระหว่าง 1-36 อักขระ | |
claims (ไม่บังคับ) | การอ้างสิทธิ์แบบกำหนดเองที่เป็นทางเลือกที่จะรวมไว้ในตัวแปร auth / request.auth กฎความปลอดภัย |
ตัวอย่างการใช้งานวิธีสร้างโทเค็นที่กำหนดเองในภาษาต่างๆที่ Firebase Admin 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-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 Admin SDK ใช้ IAM API เพื่อลงนามโทเค็น ข้อผิดพลาดนี้บ่งชี้ว่าขณะนี้ IAM API ไม่ได้เปิดใช้งานสำหรับโปรเจ็กต์ Firebase ของคุณ เปิดลิงก์ในข้อความแสดงข้อผิดพลาดในเว็บเบราว์เซอร์แล้วคลิกปุ่ม "เปิดใช้งาน 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 "ผู้สร้างโทเค็นบัญชีบริการ" ให้กับบัญชีบริการที่มีปัญหาซึ่งโดยปกติจะเป็น {project-name}@appspot.gserviceaccount.com
- เปิดหน้า IAM และผู้ดูแลระบบ ใน Google Cloud Console
- เลือกโครงการของคุณแล้วคลิก "ดำเนินการต่อ"
- คลิกไอคอนแก้ไขที่เกี่ยวข้องกับบัญชีบริการที่คุณต้องการอัปเดต
- คลิกที่ "เพิ่มบทบาทอื่น"
- พิมพ์ "ผู้สร้างโทเค็นบัญชีบริการ" ในตัวกรองการค้นหาและเลือกจากผลลัพธ์
- คลิก "บันทึก" เพื่อยืนยันการให้สิทธิ์บทบาท
โปรดดู เอกสาร 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 ที่มีการจัดการด้วยเซิร์ฟเวอร์ข้อมูลเมตา มิฉะนั้นโปรดระบุไฟล์ JSON ของบัญชีบริการหรือรหัสบัญชีบริการที่การเริ่มต้น SDK