Google 致力于为黑人社区推动种族平等。查看具体举措
หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

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

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

  1. เปิดหน้า IAM และผู้ดูแลระบบ ใน Google Cloud Console
  2. เลือกโครงการของคุณแล้วคลิก "ดำเนินการต่อ"
  3. คลิกไอคอนแก้ไขที่เกี่ยวข้องกับบัญชีบริการที่คุณต้องการอัปเดต
  4. คลิกที่ "เพิ่มบทบาทอื่น"
  5. พิมพ์ "ผู้สร้างโทเค็นบัญชีบริการ" ในตัวกรองการค้นหาและเลือกจากผลลัพธ์
  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