Kimlik Jetonlarını Doğrula

Firebase istemci uygulamanız özel bir arka uç sunucusuyla iletişim kuruyorsa o sunucuda 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ıp 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

Kimlik jetonlarını Firebase Admin SDK ile doğrulamak için bir hizmet hesabınız olmalıdır. Yönetici SDK'sını bir hizmet hesabıyla başlatma hakkında daha fazla bilgi için Yönetici SDK'sı kurulum talimatlarını uygulayın.

İstemcilerde kimlik jetonlarını alma

Bir kullanıcı veya cihaz başarıyla oturum açtığında Firebase, bunları benzersiz şekilde tanımlayan ve Firebase Realtime Database ile Cloud Storage gibi çeşitli kaynaklara erişim izni veren ilgili bir kimlik jetonu oluşturur. Özel arka uç sunucunuzda kullanıcıyı veya cihazı 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 jetonunu aldıktan sonra bu JSON Web Token'ı (JWT) arka ucunuza gönderebilir ve Firebase Admin SDK'yı kullanarak doğrulayabilirsiniz. Sunucunuz Firebase'in yerel olarak desteklemediği bir dilde yazılmışsa üçüncü taraf JWT kitaplığı kullanabilirsiniz.

Firebase Admin SDK'yı kullanarak kimlik jetonlarını doğrulama

Firebase Admin SDK'sında, kimlik jetonlarını doğrulama ve kod çözme 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.

Yönetici SDK'sını bir hizmet hesabıyla başlatmak için Yönetici SDK'sı 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ğrulaması için proje kimliği gerekir. Firebase Admin SDK'sı, 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 hizmet hesabı JSON nesnesinin project_id alanını kullanır.
  • GOOGLE_CLOUD_PROJECT ortam değişkeni ayarlanmışsa SDK, bu değişkenin 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.

Üçüncü taraf JWT kitaplığı kullanarak kimlik jetonlarını doğrulama

Arka ucunuz Firebase Admin SDK tarafından desteklenmeyen bir dildeyse kimlik jetonlarını doğrulamaya devam edebilirsiniz. Öncelikle diliniz için üçüncü taraf bir JWT kitaplığı bulun. Ardından, kimlik jetonunun başlığını, 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 Üstbilgi 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 Gelecekteki bir tarih olmalıdır. Süre, UNIX epoch'tan bu yana geçen saniye cinsinden ölçülür.
iat Oluşturulma zamanı Geçmişte olmalıdır. Zaman, UNIX epoch'tan bu yana geçen saniye cinsinden ölçülür.
aud Kitle Firebase projenizin benzersiz tanımlayıcısı olan Firebase proje kimliğiniz olmalıdır. Bu kimliği, projenin konsolunun URL'sinde bulabilirsiniz.
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 değeri olmalıdır.
auth_time Kimlik doğrulama zamanı Geçmişte olmalıdır. Kullanıcının kimlik doğrulama zamanı.

Son olarak, kimlik jetonunun, jetonun kid talebine karşılık gelen özel anahtar tarafından 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. Ortak anahtarların ne zaman yenileneceğini öğrenmek için bu uç noktadan gelen yanıtın Cache-Control başlığındaki max-age değerini kullanın.

Yukarıdaki tüm doğrulamalar başarılı olursa kimlik jetonunun konusunu (sub) ilgili kullanıcı veya cihazın uid değeri olarak kullanabilirsiniz.