หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

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

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

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

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

ก่อนที่คุณจะเริ่ม

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

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

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

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

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

การปล่อยให้ Admin SDK ค้นพบบัญชีบริการ

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

  • หากโค้ดของคุณใช้งานได้ในสภาพแวดล้อมมาตรฐานของ Google 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 Platform เพื่อให้สิทธิ์ที่จำเป็นแก่บัญชีบริการเริ่มต้น ดูส่วนการแก้ปัญหาด้านล่างสำหรับรายละเอียดเพิ่มเติม

ใช้รหัสบัญชีบริการ

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

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

ในการสร้างโทเค็นที่กำหนดเองโดยใช้รหัสบัญชีบริการแยกต่างหากให้เริ่มต้น 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

let uid = 'some-uid';

admin.auth().createCustomToken(uid)
  .then(function(customToken) {
    // Send token back to client
  })
  .catch(function(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

let userId = 'some-uid';
let additionalClaims = {
  premiumAccount: true
};

admin.auth().createCustomToken(userId, additionalClaims)
  .then(function(customToken) {
    // Send token back to client
  })
  .catch(function(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).catch(function(error) {
  // Handle Errors here.
  var errorCode = error.code;
  var errorMessage = error.message;
  // ...
});

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

ในทางเดียวกันเช่นเดียวกับวิธีการอื่น ๆ ในการลงชื่อเข้า (เช่น signInWithEmailAndPassword() และ signInWithCredential() ) เดอะ auth ของวัตถุในของคุณ Firebase Realtime ฐานข้อมูลกฎการรักษาความปลอดภัย และ request.auth วัตถุของคุณใน การจัดเก็บเมฆกฎการรักษาความปลอดภัย จะมีประชากรที่มีของผู้ใช้ uid . ในกรณีนี้ 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 Platform
  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