หากแอปไคลเอ็นต์ Firebase สื่อสารกับเซิร์ฟเวอร์แบ็กเอนด์ที่กำหนดเอง คุณจะ
อาจต้องระบุผู้ใช้ที่ลงชื่อเข้าใช้อยู่ในเซิร์ฟเวอร์นั้น โดยดำเนินการดังนี้
อย่างปลอดภัย หลังจากลงชื่อเข้าใช้สำเร็จ ให้ส่งโทเค็น ID ของผู้ใช้ไปยังเซิร์ฟเวอร์ของคุณ
การใช้ HTTPS จากนั้น บนเซิร์ฟเวอร์ ให้ยืนยันความถูกต้องและความน่าเชื่อถือของ
โทเค็นรหัสและเรียกข้อมูล uid
จากโทเค็นนั้น คุณใช้ uid
ที่ส่งใน
ด้วยวิธีนี้ จะสามารถระบุผู้ใช้ที่ลงชื่อเข้าใช้อยู่ในเซิร์ฟเวอร์ของคุณได้อย่างปลอดภัย
ก่อนเริ่มต้น
หากต้องการยืนยันโทเค็นรหัสด้วย Firebase Admin SDK คุณต้องมีบริการ ของคุณได้ ทำตามวิธีการตั้งค่า Admin SDK สำหรับ ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีเริ่มต้น Admin SDK ด้วยบัญชีบริการ
เรียกโทเค็นรหัสในไคลเอ็นต์
เมื่อผู้ใช้หรืออุปกรณ์ลงชื่อเข้าใช้สำเร็จ Firebase จะสร้าง โทเค็นรหัสที่ระบุตัวผู้ใช้โดยไม่ซ้ำกันและให้สิทธิ์ในการเข้าถึง เช่น Firebase Realtime Database และ Cloud Storage คุณสามารถ นำโทเค็นรหัสนั้นมาใช้ซ้ำเพื่อระบุผู้ใช้หรืออุปกรณ์ในแบ็กเอนด์ที่กำหนดเอง เซิร์ฟเวอร์ หากต้องการดึงข้อมูลโทเค็นรหัสจากไคลเอ็นต์ โปรดตรวจสอบว่าผู้ใช้ลงชื่อเข้าใช้แล้ว in จากนั้นรับโทเค็นรหัสจากผู้ใช้ที่ลงชื่อเข้าใช้ ดังนี้
iOS ขึ้นไป
Objective-C
FIRUser *currentUser = [FIRAuth auth].currentUser;
[currentUser getIDTokenForcingRefresh:YES
completion:^(NSString *_Nullable idToken,
NSError *_Nullable error) {
if (error) {
// Handle error
return;
}
// Send token to your backend via HTTPS
// ...
}];
Swift
let currentUser = FIRAuth.auth()?.currentUser
currentUser?.getIDTokenForcingRefresh(true) { idToken, error in
if let error = error {
// Handle error
return;
}
// Send token to your backend via HTTPS
// ...
}
Android
FirebaseUser mUser = FirebaseAuth.getInstance().getCurrentUser();
mUser.getIdToken(true)
.addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
public void onComplete(@NonNull Task<GetTokenResult> task) {
if (task.isSuccessful()) {
String idToken = task.getResult().getToken();
// Send token to your backend via HTTPS
// ...
} else {
// Handle error -> task.getException();
}
}
});
Unity
Firebase.Auth.FirebaseUser user = auth.CurrentUser;
user.TokenAsync(true).ContinueWith(task => {
if (task.IsCanceled) {
Debug.LogError("TokenAsync was canceled.");
return;
}
if (task.IsFaulted) {
Debug.LogError("TokenAsync encountered an error: " + task.Exception);
return;
}
string idToken = task.Result;
// Send token to your backend via HTTPS
// ...
});
C++
firebase::auth::User user = auth->current_user();
if (user.is_valid()) {
firebase::Future<std::string> idToken = user.GetToken(true);
// Send token to your backend via HTTPS
// ...
}
เว็บ
firebase.auth().currentUser.getIdToken(/* forceRefresh */ true).then(function(idToken) {
// Send token to your backend via HTTPS
// ...
}).catch(function(error) {
// Handle error
});
เมื่อมีโทเค็นรหัสแล้ว คุณก็ส่ง JWT นั้นไปยังแบ็กเอนด์และตรวจสอบความถูกต้องได้ โดยใช้ Firebase Admin SDK หรือใช้ JWT ของบุคคลที่สาม ไลบรารีหากเซิร์ฟเวอร์ของคุณเขียนในภาษาที่ Firebase ไม่ใช่ โดยตรง
ยืนยันโทเค็นรหัสโดยใช้ Firebase Admin SDK
Firebase Admin SDK มีวิธียืนยันและถอดรหัสรหัสในตัว
โทเค็น หากโทเค็นรหัสที่ระบุมีรูปแบบที่ถูกต้อง ไม่หมดอายุ และ
เซ็นชื่ออย่างถูกต้อง เมธอดจะแสดงโทเค็นรหัสที่ถอดรหัสแล้ว คุณสามารถคว้า
uid
ของผู้ใช้หรืออุปกรณ์จากโทเค็นที่ถอดรหัส
ทําตามวิธีการตั้งค่า Admin SDK เพื่อเริ่มต้น
Admin SDK ด้วยบัญชีบริการ จากนั้นใช้เมธอด verifyIdToken()
วิธียืนยันโทเค็นรหัส
Node.js
// idToken comes from the client app
getAuth()
.verifyIdToken(idToken)
.then((decodedToken) => {
const uid = decodedToken.uid;
// ...
})
.catch((error) => {
// Handle error
});
Java
// idToken comes from the client app (shown above)
FirebaseToken decodedToken = FirebaseAuth.getInstance().verifyIdToken(idToken);
String uid = decodedToken.getUid();
Python
# id_token comes from the client app (shown above)
decoded_token = auth.verify_id_token(id_token)
uid = decoded_token['uid']
Go
client, err := app.Auth(ctx)
if err != nil {
log.Fatalf("error getting Auth client: %v\n", err)
}
token, err := client.VerifyIDToken(ctx, idToken)
if err != nil {
log.Fatalf("error verifying ID token: %v\n", err)
}
log.Printf("Verified ID token: %v\n", token)
C#
FirebaseToken decodedToken = await FirebaseAuth.DefaultInstance
.VerifyIdTokenAsync(idToken);
string uid = decodedToken.Uid;
การยืนยันโทเค็นรหัสต้องใช้รหัสโปรเจ็กต์ Firebase Admin SDK เพื่อรับรหัสโปรเจ็กต์ด้วยวิธีใดวิธีหนึ่งต่อไปนี้
- หากเริ่มต้น SDK ด้วยตัวเลือกแอป
projectId
ที่ชัดเจน SDK จะใช้ค่าของตัวเลือกดังกล่าว - หากเริ่มต้น SDK ด้วยข้อมูลเข้าสู่ระบบของบัญชีบริการ SDK จะใช้
ช่อง
project_id
ของออบเจ็กต์ JSON ของบัญชีบริการ - หากตั้งค่าตัวแปรสภาพแวดล้อม
GOOGLE_CLOUD_PROJECT
ไว้ SDK จะใช้ เป็นรหัสโปรเจ็กต์ ตัวแปรสภาพแวดล้อมนี้พร้อมใช้งานสำหรับ ที่ทำงานในโครงสร้างพื้นฐานของ Google เช่น App Engine และ Compute Engine
ยืนยันโทเค็นรหัสโดยใช้ไลบรารี JWT ของบุคคลที่สาม
หากแบ็กเอนด์เป็นภาษาที่ผู้ดูแลระบบ Firebase ไม่รองรับ SDK คุณยังยืนยันโทเค็นของรหัสได้ อันดับแรก ค้นหาไลบรารี JWT ของบุคคลที่สามสำหรับภาษาของคุณ จากนั้นให้ทำดังนี้ ตรวจสอบส่วนหัว เพย์โหลด และลายเซ็นของโทเค็นรหัส
ตรวจสอบว่าส่วนหัวของโทเค็นรหัสสอดคล้องกับข้อจำกัดต่อไปนี้
การอ้างสิทธิ์ส่วนหัวของโทเค็นรหัส | ||
---|---|---|
alg |
อัลกอริทึม | "RS256" |
kid |
รหัสคีย์ |
ต้องตรงกับคีย์สาธารณะที่ระบุไว้ในรายการ
https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com
|
ยืนยันว่าเพย์โหลดของโทเค็นรหัสเป็นไปตามข้อจำกัดต่อไปนี้
การอ้างสิทธิ์เพย์โหลดโทเค็นรหัส | ||
---|---|---|
exp |
เวลาหมดอายุ | ต้องเป็นวันที่ในอนาคต เวลาจะวัดหน่วยเป็นวินาทีนับตั้งแต่ UNIX Epoch |
iat |
เวลาที่ออก | ต้องเป็นวันที่ในอดีต เวลาจะวัดหน่วยเป็นวินาทีนับตั้งแต่ UNIX Epoch |
aud |
กลุ่มเป้าหมาย | ต้องเป็นรหัสโปรเจ็กต์ Firebase ซึ่งเป็นตัวระบุที่ไม่ซ้ำกันสำหรับ Firebase ซึ่งสามารถดูได้ใน URL ของคอนโซลของโปรเจ็กต์นั้น |
iss |
ผู้ออก |
ต้องเป็น "https://securetoken.google.com/<projectId>"
โดยที่ <projectId> คือรหัสโปรเจ็กต์เดียวกันกับที่ใช้สำหรับ
aud ด้านบน
|
sub |
เรื่อง |
ต้องเป็นสตริงที่ไม่ว่างเปล่าและต้องเป็น uid ของผู้ใช้หรือ
อุปกรณ์
|
auth_time
|
เวลาในการตรวจสอบสิทธิ์ | ต้องเป็นวันที่ในอดีต เวลาที่ผู้ใช้ตรวจสอบสิทธิ์ |
สุดท้าย ตรวจสอบว่าโทเค็นรหัสได้รับการลงนามโดยคีย์ส่วนตัวที่ตรงกัน
ต่อการอ้างสิทธิ์ kid
ของโทเค็น รับคีย์สาธารณะจาก
https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com
และใช้ไลบรารี JWT เพื่อยืนยันลายเซ็น ใช้ค่าของ max-age
ใน
ส่วนหัว Cache-Control
ของการตอบสนองจากปลายทางนั้นเพื่อให้ทราบเวลาที่ควร
รีเฟรชคีย์สาธารณะ
หากการยืนยันทั้งหมดข้างต้นประสบความสำเร็จ คุณสามารถใช้เรื่อง (sub
) ได้
ของโทเค็นรหัสเป็น uid
ของผู้ใช้หรืออุปกรณ์ที่เกี่ยวข้อง