Kimlik Jetonlarını Doğrula

Firebase istemci uygulamanız özel bir arka uç sunucusuyla iletişim kuruyorsa söz konusu sunucuda oturumu açık olan kullanıcıyı tanımlamanız gerekebilir. Bunu güvenli bir şekilde yapmak için başarılı bir oturum açtıktan sonra kullanıcının kimlik jetonunu HTTPS kullanarak sunucunuza gönderin. Ardından, sunucudaki kimlik jetonunun bütünlüğünü ve gerçekliğini doğrulayın ve uid değerini alın. Sunucunuzda şu anda oturum açmış olan kullanıcıyı güvenli bir şekilde tanımlamak için bu şekilde iletilen uid değerini kullanabilirsiniz.

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 ilk kullanıma hazırlama 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, kullanıcıyı benzersiz şekilde tanımlayan ve Firebase Realtime Database ve Cloud Storage gibi çeşitli kaynaklara erişim izni veren ilgili bir kimlik jetonu oluşturur. Bu kimlik jetonunu, özel arka uç sunucunuzda kullanıcıyı veya cihazı tanımlamak için 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
});

Bir kimlik jetonunuz olduğunda bu JWT'yi arka ucunuza gönderebilir ve Firebase Admin SDK'sını kullanarak veya sunucunuz Firebase'in doğal olarak desteklemediği bir dilde yazılmışsa üçüncü taraf bir JWT kitaplığı kullanarak doğrulayabilirsiniz.

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

Firebase Admin SDK'sında, kimlik jetonlarını doğrulamak ve kodlarını çö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 bir şekilde imzalanmışsa yöntem, kodu çözülmüş kimlik jetonunu döndürür. Çözülmüş jetondan kullanıcının veya cihazın uid değerini 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ğrulaması için proje kimliği gerekir. Firebase Admin SDK, aşağıdaki yöntemlerden biriyle proje kimliği elde etmeye ç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, değerini proje kimliği olarak kullanır. Bu ortam değişkeni, Google altyapısında çalışan kodlarda (ör. App Engine ve Compute Engine) kullanılabilir.

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

Arka uçunuz Firebase Yönetici SDK'sı tarafından desteklenmeyen bir dildeyse kimlik jetonlarını doğrulamaya devam edebilirsiniz. Öncelikle diliniz için bir üçüncü taraf JWT kitaplığı bulun. Ardından, kimlik jetonunun üst bilgisini, yükü ve imzasını doğrulayın.

Kimlik jetonunun başlığının aşağıdaki kısıtlamalara uyduğunu doğrulayın:

Kimlik jetonu başlık iddiaları
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ü aşağıdaki kısıtlamalara uygun olmalıdır:

Kimlik Jetonu Yük Verisi Hak Talepleri
exp Geçerlilik süresi Gelecekte olmalıdır. Zaman, UNIX sıfır zamanından itibaren saniye cinsinden ölçülür.
iat Yayınlanma zamanı Geçmişte olmalıdır. Zaman, UNIX sıfır zamanından itibaren saniye cinsinden ölçülür.
aud Kitle Firebase proje kimliğiniz olmalıdır. Firebase projenizin benzersiz tanımlayıcısı olan bu kimliği, projenin konsolunun URL'sinde bulabilirsiniz.
iss Düzenleyen "https://securetoken.google.com/<projectId>" olmalıdır. Bu durumda <projectId>, yukarıdaki aud için kullanılan proje kimliğiyle aynı olmalıdır.
sub Konu Boş olmayan bir dize olmalıdır 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 iddiasına karşılık gelen özel anahtar tarafından imzalandığından emin olun. Ortak anahtarı https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com'den alın ve imzayı doğrulamak için bir JWT kitaplığı kullanın. Genel anahtarları ne zaman yenileyeceğinizi öğrenmek için ilgili uç noktadan gelen yanıtın Cache-Control üstbilgisinde max-age değerini kullanın.

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