Firebase istemci uygulamanız özel bir arka uç sunucusuyla iletişim kuruyorsa o sunucuda şu anda oturum açmış olan kullanıcıyı tanımlamanız gerekebilir. Bunu güvenli bir şekilde yapmak için başarılı bir oturum açma işleminden sonra kullanıcının kimlik jetonunu HTTPS kullanarak sunucunuza gönderin. Ardından, sunucuda kimlik jetonunun bütünlüğünü ve gerçekliğini doğrulayın ve jetondan uid
değerini alın. Bu şekilde iletilen uid
, sunucunuzda oturum açmış olan kullanıcıyı güvenli bir şekilde tanımlamak için kullanılabilir.
Başlamadan önce
Firebase Admin SDK ile kimlik jetonlarını doğrulamak için bir hizmet hesabınızın olması gerekir. Admin SDK'yı bir hizmet hesabıyla başlatma hakkında daha fazla bilgi için Admin SDK kurulum talimatlarını uygulayın.
İstemcilerde kimlik jetonlarını alma
Bir kullanıcı veya cihaz başarıyla oturum açtığında Firebase, kullanıcıyı ya da cihazı benzersiz şekilde tanımlayan ve Firebase Realtime Database ile Cloud Storage gibi çeşitli kaynaklara erişim izni veren bir kimlik jetonu oluşturur. Kullanıcıyı veya cihazı özel arka uç sunucunuzda tanımlamak için bu kimlik jetonunu yeniden kullanabilirsiniz. İstemciden kimlik jetonunu almak için kullanıcının oturum açtığından emin olun ve ardından oturum açmış kullanıcıdan kimlik jetonunu alın:
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
// ...
}
Web
firebase.auth().currentUser.getIdToken(/* forceRefresh */ true).then(function(idToken) {
// Send token to your backend via HTTPS
// ...
}).catch(function(error) {
// Handle error
});
Kimlik jetonunuz olduğunda bu JWT'yi arka ucunuza gönderebilir ve Firebase Admin SDK'yı kullanarak ya da sunucunuz Firebase'in yerel olarak desteklemediği bir dilde yazılmışsa üçüncü taraf JWT kitaplığını kullanarak doğrulayabilirsiniz.
Firebase Admin SDK'yı kullanarak kimlik jetonlarını doğrulama
Firebase Admin SDK'sında, kimlik jetonlarını doğrulayıp kodunu çözmek için yerleşik bir yöntem bulunur. Sağlanan kimlik jetonu doğru biçime sahipse, süresi dolmamışsa ve düzgün şekilde imzalanmışsa yöntem, kodu çözülmüş kimlik jetonunu döndürür. Kullanıcının veya cihazın uid
değerini, kodu çözülmüş jetondan alabilirsiniz.
Admin SDK'yı bir hizmet hesabıyla başlatmak için Admin SDK kurulum talimatlarını uygulayın. Ardından, kimlik jetonunu doğrulamak için verifyIdToken()
yöntemini kullanın:
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;
Kimlik jetonu doğrulama için proje kimliği gerekir. Firebase Admin SDK, aşağıdaki yöntemlerden birini kullanarak proje kimliği almaya çalışır:
- SDK, açık bir
projectId
uygulama seçeneğiyle başlatıldıysa SDK, bu seçeneğin değerini kullanır. - SDK, hizmet hesabı kimlik bilgileriyle başlatıldıysa SDK, hizmet hesabı JSON nesnesinin
project_id
alanını kullanır. GOOGLE_CLOUD_PROJECT
ortam değişkeni ayarlanmışsa SDK, değerini proje kimliği olarak kullanır. Bu ortam değişkeni, App Engine ve Compute Engine gibi Google altyapısında çalışan kodlar için kullanılabilir.
Kimlik jetonlarını üçüncü taraf JWT kitaplığı kullanarak doğrulama
Arka uçunuz Firebase Admin SDK'sı tarafından desteklenmeyen bir dildeyse kimlik jetonlarını yine de doğrulayabilirsiniz. Öncelikle diliniz için üçüncü taraf bir JWT kitaplığı bulun. Ardından, kimlik jetonunun üstbilgisini, yükünü ve imzasını doğrulayın.
Kimlik jetonunun başlığının aşağıdaki kısıtlamalara uygun olduğunu doğrulayın:
Kimlik jetonu başlığı talepleri | ||
---|---|---|
alg |
Algoritma | "RS256" |
kid |
Anahtar Kimliği |
https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com adresinde listelenen ortak anahtarlardan biriyle eşleşmelidir.
|
Kimlik jetonunun yükünün aşağıdaki kısıtlamalara uygun olduğunu doğrulayın:
Kimlik jetonu yükü talepleri | ||
---|---|---|
exp |
Geçerlilik süresi | Gelecekte olmalıdır. Süre, UNIX sıfır zamanından itibaren saniye cinsinden ölçülür. |
iat |
Yayınlanma zamanı | Geçmişte olmalıdır. Süre, UNIX sıfır zamanından itibaren saniye cinsinden ölçülür. |
aud |
Kitle | Firebase projenizin benzersiz tanımlayıcısı olan Firebase proje kimliğiniz olmalıdır. Bu kimlik, ilgili projenin konsol URL'sinde yer alır. |
iss |
Düzenleyen |
"https://securetoken.google.com/<projectId>" olmalıdır.
Burada <projectId> , yukarıdaki aud için kullanılan proje kimliğiyle aynıdır.
|
sub |
Konu |
Boş olmayan bir dize olmalı ve kullanıcının veya cihazın uid olmalıdır.
|
auth_time
|
Kimlik doğrulama zamanı | Geçmişte olmalıdır. Kullanıcının kimliğini doğruladığı zaman. |
Son olarak, kimlik jetonunun, jetonun kid
talebine karşılık gelen özel anahtarla imzalandığından emin olun. https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com
adresinden ortak anahtarı alın
ve imzayı doğrulamak için bir JWT kitaplığı kullanın. Genel anahtarların ne zaman yenileneceğini öğrenmek için uç noktadan gelen yanıttaki Cache-Control
üstbilgisinde max-age
değerini kullanın.
Yukarıdaki tüm doğrulamalar başarılı olursa kimlik jetonunun konusunu (sub
) ilgili kullanıcının veya cihazın uid
olarak kullanabilirsiniz.