Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

สร้างโทเค็นที่กำหนดเอง

Firebase ให้คุณควบคุมการพิสูจน์ตัวตนได้อย่างสมบูรณ์โดยอนุญาตให้คุณตรวจสอบผู้ใช้หรืออุปกรณ์โดยใช้ JSON Web Tokens (JWT) ที่ปลอดภัย คุณสร้างราชสกุลเหล่านี้บนเซิร์ฟเวอร์ของคุณผ่านพวกเขากลับไปยังอุปกรณ์ลูกค้าแล้วใช้พวกเขาในการตรวจสอบผ่านทาง signInWithCustomToken() วิธีการ

เพื่อให้บรรลุสิ่งนี้ คุณต้องสร้างปลายทางของเซิร์ฟเวอร์ที่ยอมรับข้อมูลรับรองการลงชื่อเข้าใช้—เช่น ชื่อผู้ใช้และรหัสผ่าน—และหากข้อมูลประจำตัวถูกต้อง ส่งคืน JWT ที่กำหนดเอง JWT กำหนดเองกลับมาจากเซิร์ฟเวอร์ของคุณนั้นจะสามารถใช้อุปกรณ์โดยลูกค้าสามารถตรวจสอบกับ Firebase ( iOS , Android , เว็บ ) เมื่อตรวจสอบสิทธิ์แล้ว ระบบจะใช้ข้อมูลประจำตัวนี้เมื่อเข้าถึงบริการ Firebase อื่นๆ เช่น Firebase Realtime Database และ Cloud Storage นอกจากนี้เนื้อหาของ JWT จะสามารถใช้ได้ใน auth วัตถุของคุณใน เรียลไทม์กฎฐานข้อมูล และ request.auth วัตถุของคุณใน การจัดเก็บเมฆกฎการรักษาความปลอดภัย

คุณสามารถสร้างโทเค็นที่กำหนดเองด้วย Firebase Admin SDK หรือคุณสามารถใช้ไลบรารี JWT ของบุคคลที่สามได้หากเซิร์ฟเวอร์ของคุณเขียนในภาษาที่ Firebase ไม่รองรับโดยกำเนิด

ก่อนจะเริ่ม

โทเค็นที่กำหนดเองได้รับการลงนาม JWT โดยที่คีย์ส่วนตัวที่ใช้สำหรับการลงชื่อเป็นของบัญชีบริการของ Google มีหลายวิธีในการระบุบัญชีบริการของ Google ที่ Firebase Admin SDK ควรใช้สำหรับการลงนามโทเค็นที่กำหนดเอง:

  • โดยใช้ไฟล์ JSON บัญชีบริการ - วิธีการนี้สามารถนำมาใช้ในสภาพแวดล้อมใด ๆ แต่คุณจะต้องแพคเกจแฟ้มบัญชีบริการ JSON พร้อมกับรหัสของคุณ ต้องใช้ความระมัดระวังเป็นพิเศษเพื่อให้แน่ใจว่าไฟล์ JSON ของบัญชีบริการจะไม่เปิดเผยต่อบุคคลภายนอก
  • ปล่อยให้ SDK ผู้ดูแลระบบค้นพบบัญชีผู้ใช้บริการ - วิธีการนี้สามารถนำมาใช้ในสภาพแวดล้อมที่มีการจัดการโดย Google เช่นฟังก์ชั่น Google Cloud และ App Engine คุณอาจต้องกำหนดค่าการอนุญาตเพิ่มเติมบางอย่างผ่าน Google Cloud Console
  • การใช้รหัสบัญชีบริการ - เมื่อนำมาใช้ในสภาพแวดล้อมที่จัดการโดย Google วิธีการนี้จะลงนามราชสกุลใช้คีย์บัญชีผู้ใช้บริการที่ระบุไว้ของ อย่างไรก็ตาม มันใช้บริการเว็บระยะไกล และคุณอาจต้องกำหนดค่าการอนุญาตเพิ่มเติมสำหรับบัญชีบริการนี้ผ่าน Google Cloud Console

การใช้ไฟล์ JSON ของบัญชีบริการ

ไฟล์ JSON ของบัญชีบริการมีข้อมูลทั้งหมดที่สอดคล้องกับบัญชีบริการ (รวมถึงคีย์ส่วนตัว RSA) สามารถดาวน์โหลดได้จากคอนโซล Firebase ทำตาม SDK ผู้ดูแลระบบตั้งค่าคำแนะนำ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการเริ่มต้น SDK ผู้ดูแลระบบด้วยบัญชีไฟล์ JSON บริการ

วิธีการเริ่มต้นนี้เหมาะสำหรับการปรับใช้ Admin SDK ที่หลากหลาย นอกจากนี้ยังช่วยให้ Admin SDK สร้างและลงนามโทเค็นที่กำหนดเองในเครื่อง โดยไม่ต้องทำการเรียก API ระยะไกลใดๆ ข้อเสียเปรียบหลักของวิธีนี้คือคุณต้องจัดแพ็คเกจไฟล์ JSON ของบัญชีบริการพร้อมกับรหัสของคุณ นอกจากนี้ โปรดทราบว่าคีย์ส่วนตัวในไฟล์ JSON ของบัญชีบริการเป็นข้อมูลที่ละเอียดอ่อน และต้องใช้ความระมัดระวังเป็นพิเศษเพื่อเก็บเป็นความลับ โดยเฉพาะอย่าเพิ่มไฟล์ JSON ของบัญชีบริการลงในการควบคุมเวอร์ชันสาธารณะ

ให้ Admin SDK ค้นพบบัญชีบริการ

หากโค้ดของคุณใช้งานได้ในสภาพแวดล้อมที่จัดการโดย Google Admin SDK สามารถพยายามค้นหาวิธีการลงนามโทเค็นที่กำหนดเองโดยอัตโนมัติ:

  • หากรหัสของคุณมีการใช้งานในสภาพแวดล้อมมาตรฐาน App Engine สำหรับ Java, Python หรือไป SDK ผู้ดูแลระบบสามารถใช้ บริการของแอปเอกลักษณ์ ปัจจุบันในสภาพแวดล้อมที่จะลงนามราชสกุลที่กำหนดเอง บริการ App Identity ลงนามข้อมูลโดยใช้บัญชีบริการที่ Google App Engine จัดเตรียมไว้สำหรับแอปของคุณ

  • หากรหัสของคุณมีการใช้งานในสภาพแวดล้อมที่มีการจัดการอื่น ๆ (เช่นฟังก์ชั่น Google Cloud, Google Compute Engine) ที่ Firebase SDK ผู้ดูแลระบบสามารถอัตโนมัติค้นพบสตริงบัญชีบริการ ID จากท้องถิ่น เซิร์ฟเวอร์เมตาดาต้า จากนั้นใช้รหัสบัญชีบริการที่ค้นพบร่วมกับบริการ IAM เพื่อลงนามโทเค็นจากระยะไกล

หากต้องการใช้วิธีลงนามเหล่านี้ ให้เริ่มต้น SDK ด้วยข้อมูลรับรองเริ่มต้นของแอปพลิเคชัน Google และไม่ต้องระบุสตริงรหัสบัญชีบริการ:

Node.js

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 จัดให้:

เช่นเดียวกับที่มีรหัสบัญชีบริการระบุไว้อย่างชัดเจนรหัสบัญชีผู้ใช้บริการอัตโนมัติ discoverd ต้องมี iam.serviceAccounts.signBlob อนุญาตสำหรับการกำหนดเองสร้างโทเค็นการทำงาน คุณอาจจะต้องใช้ IAM และผู้ดูแล ในส่วนของคอนโซล Google Cloud ที่จะให้บัญชีบริการเริ่มต้นสิทธิ์ที่จำเป็น ดูส่วนการแก้ไขปัญหาด้านล่างสำหรับรายละเอียดเพิ่มเติม

การใช้ ID บัญชีบริการ

เพื่อรักษาความสอดคล้องระหว่างส่วนต่างๆ ของแอปพลิเคชันของคุณ คุณสามารถระบุรหัสบัญชีบริการที่จะใช้คีย์ในการลงนามโทเค็นเมื่อทำงานในสภาพแวดล้อมที่จัดการโดย Google ซึ่งจะทำให้นโยบาย IAM ง่ายขึ้นและปลอดภัยยิ่งขึ้น และไม่ต้องรวมไฟล์ JSON ของบัญชีบริการในโค้ดของคุณ

รหัสบัญชีผู้ใช้บริการสามารถพบได้ใน คอนโซล Google Cloud หรือใน client_email ด้านการบริการดาวน์โหลดไฟล์ JSON บัญชี รหัสบัญชีบริการที่อยู่อีเมลที่มีรูปแบบต่อไปนี้: <client-id>@<project-id>.iam.gserviceaccount.com โดยจะระบุบัญชีบริการที่ไม่ซ้ำกันในโปรเจ็กต์ Firebase และ Google Cloud

ในการสร้างโทเค็นที่กำหนดเองโดยใช้รหัสบัญชีบริการแยกต่างหาก ให้เริ่มต้น SDK ดังที่แสดงด้านล่าง:

Node.js

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 จะต้องเรียกใช้บริการระยะไกล นอกจากนี้คุณยังจะต้องตรวจสอบให้แน่ใจว่าบริการบัญชี SDK ผู้ดูแลระบบคือการใช้เพื่อโทรนี้ -usually {project-name}@appspot.gserviceaccount.com - มี iam.serviceAccounts.signBlob ได้รับอนุญาต ดูส่วนการแก้ไขปัญหาด้านล่างสำหรับรายละเอียดเพิ่มเติม

สร้างโทเค็นที่กำหนดเองโดยใช้ Firebase Admin SDK

Firebase Admin 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);
  });

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 วัตถุในกฎการรักษาความปลอดภัยของคุณ:

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);
  });

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

ลงชื่อเข้าใช้ด้วยโทเค็นที่กำหนดเองบนไคลเอนต์

หลังจากที่คุณสร้างโทเค็นที่กำหนดเองแล้ว คุณควรส่งไปยังแอปไคลเอนต์ของคุณ ตรวจสอบสิทธิ์ app ลูกค้ามีการกำหนดโทเค็นโดยการเรียก signInWithCustomToken() :

iOS

วัตถุประสงค์-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);
                }
            }
        });

ความสามัคคี

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;
    // ...
  });

หากตรวจสอบสำเร็จผู้ใช้ของคุณจะได้รับการลงนามในขณะนี้ใน app ลูกค้าของคุณกับบัญชีที่ระบุโดย uid รวมอยู่ในโทเค็นที่กำหนดเอง หากก่อนหน้านี้ไม่มีบัญชีนั้น ระบบจะสร้างบันทึกสำหรับผู้ใช้รายนั้น

ในทางเดียวกันเช่นเดียวกับวิธีการอื่น ๆ ในการลงชื่อเข้า (เช่น signInWithEmailAndPassword() และ signInWithCredential() ) เดอะ auth ของวัตถุของคุณใน เรียลไทม์กฎฐานข้อมูล และ 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 ฐานข้อมูล) หรือ 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 ที่โทเค็นหมดอายุ มันอาจจะเป็นสูงสุด 3600 วินาทีช้ากว่า iat
หมายเหตุ: นี้จะควบคุมเฉพาะเวลาที่กำหนดเองโทเค็นของตัวเองหมด แต่เมื่อคุณเข้าสู่ระบบของผู้ใช้ในการใช้ 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

หากคุณกำลังระบุ ID บัญชีบริการสำหรับการเซ็นชื่อโทเค็น คุณอาจได้รับข้อผิดพลาดที่คล้ายกับต่อไปนี้:

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 ผู้ดูแลระบบใช้ API IAM เพื่อราชสกุลเข้าสู่ระบบ ข้อผิดพลาดนี้บ่งชี้ว่าขณะนี้ IAM API ไม่ได้เปิดใช้งานสำหรับโปรเจ็กต์ Firebase ของคุณ เปิดลิงก์ในข้อความแสดงข้อผิดพลาดในเว็บเบราว์เซอร์ และคลิกปุ่ม "เปิดใช้งาน API" เพื่อเปิดใช้งานสำหรับโครงการของคุณ

บัญชีบริการไม่มีการอนุญาตที่จำเป็น

ถ้าบริการบัญชี Firebase SDK ผู้ดูแลระบบกำลังทำงานเป็นไม่ได้มี iam.serviceAccounts.signBlob รับอนุญาตคุณอาจได้รับข้อผิดพลาดเช่นต่อไปนี้:

Permission iam.serviceAccounts.signBlob is required to perform this operation
on service account projects/-/serviceAccounts/{your-service-account-id}.

วิธีที่ง่ายที่สุดในการแก้ปัญหานี้คือการให้ "บัญชีบริการ Token ผู้สร้าง" บทบาท IAM การบัญชีบริการในคำถามที่มักจะ {project-name}@appspot.gserviceaccount.com :

  1. เปิด IAM และผู้ดูแล หน้าคอนโซล Google Cloud
  2. เลือกโครงการของคุณและคลิก "ดำเนินการต่อ"
  3. คลิกไอคอนแก้ไขที่เกี่ยวข้องกับบัญชีบริการที่คุณต้องการอัปเดต
  4. คลิกที่ "เพิ่มบทบาทอื่น"
  5. พิมพ์ "Service Account Token Creator" ลงในตัวกรองการค้นหา และเลือกจากผลลัพธ์
  6. คลิก "บันทึก" เพื่อยืนยันการมอบบทบาท

อ้างถึง เอกสาร 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