Kimlik Jetonlarını Doğrulama

Firebase istemci uygulamanız özel bir arka uç sunucusuyla iletişim kuruyorsa o sunucuda oturum açmış olan kullanıcıyı belirlemeniz gerekebilir. Bunu güvenli bir şekilde yapmak için başarılı bir oturum açma işleminden sonra HTTPS kullanarak kullanıcının kimlik jetonunu sunucunuza gönderin. Ardından sunucuda kimlik jetonunun bütünlüğünü ve özgünlüğünü doğrulayın ve uid öğesini bu jetondan alın. Sunucunuzda oturumu açık olan kullanıcıyı güvenli bir şekilde tanımlamak için bu şekilde iletilen uid kullanabilirsiniz.

Başlamadan önce

Kimlik jetonlarını Firebase Admin SDK ile 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.

İstemcilerdeki kimlik jetonlarını alma

Bir kullanıcı veya cihaz başarıyla oturum açtığında Firebase, kullanıcıyı benzersiz şekilde tanımlayan ve Firebase Realtime Database ve Cloud Storage gibi çeşitli kaynaklara erişim izni veren karşılık gelen bir kimlik jetonu oluşturur. Özel arka uç sunucunuzda kullanıcıyı veya cihazı tanımlamak için bu kimlik jetonunu yeniden kullanabilirsiniz. Kimlik jetonunu istemciden 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 ve üzeri

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 veya sunucunuz Firebase'in yerel olarak desteklemediği bir dilde yazılmışsa üçüncü taraf bir JWT kitaplığı kullanarak bunu doğrulayabilirsiniz.

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

Firebase Admin SDK'da, kimlik jetonlarını doğrulamak ve kodunu çözmek için yerleşik bir yöntem bulunur. Sağlanan kimlik jetonu doğru biçimdeyse, süresi dolmamışsa ve doğru şekilde imzalanmışsa yöntem, kodu çözülmüş kimlik jetonunu döndürür. Kullanıcının veya cihazın uid kodunu çö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ğrulama için proje kimliği gerekir. Firebase Admin SDK'sı, aşağıdaki yöntemlerden biriyle 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 ayarlanırsa SDK bu değeri 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 ucunuz Firebase Admin SDK'sı tarafından desteklenmeyen bir dilde olsa bile kimlik jetonlarını doğrulayabilirsiniz. Öncelikle dilinize uygun bir üçüncü taraf 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 Başlığı Hak Talepleri
alg Algoritma "RS256"
kid Anahtar Kimliği https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com adresinde listelenen ortak anahtarlardan birine karşılık gelmelidir

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 döneminden bu yana saniye cinsinden ölçülür.
iat Yayınlanma zamanı Geçmiş bir tarih olmalıdır. Süre, UNIX döneminden bu yana saniye cinsinden ölçülür.
aud Kitle Firebase proje kimliğiniz olmalıdır. Firebase projenizin benzersiz tanımlayıcısıdır ve ilgili projenin konsolunun URL'sinde bulunabilir.
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ı veya cihaza ait uid olmalıdır.
auth_time Kimlik doğrulama zamanı Geçmiş bir tarih olmalıdır. Kullanıcının kimlik doğrulamasının yapıldığı zaman.

Son olarak, kimlik jetonunun, jetonun kid isteğine karşılık gelen özel anahtar tarafından imzalandığından emin olun. https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com hizmetinden 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 ilgili uç noktadan gelen yanıtın Cache-Control başlığında max-age değerini kullanın.

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