Firebase Summit에서 발표된 모든 내용을 살펴보고 Firebase로 앱을 빠르게 개발하고 안심하고 앱을 실행하는 방법을 알아보세요. 자세히 알아보기

ID 토큰 확인

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

Firebase 클라이언트 앱이 맞춤 백엔드 서버와 통신하는 경우 해당 서버에서 현재 로그인한 사용자를 식별해야 할 수 있습니다. 안전하게 하려면 로그인에 성공한 후 HTTPS를 사용하여 사용자의 ID 토큰을 서버로 보냅니다. 그런 다음 서버에서 ID 토큰의 무결성과 신뢰성을 확인하고 uid 를 검색합니다. 이러한 방식으로 전송된 uid 를 사용하여 현재 서버에 로그인한 사용자를 안전하게 식별할 수 있습니다.

시작하기 전에

Firebase Admin SDK로 ID 토큰을 확인하려면 서비스 계정이 있어야 합니다. 서비스 계정으로 Admin SDK를 초기화하는 방법에 대한 자세한 내용은 Admin SDK 설정 지침 을 따르세요.

클라이언트에서 ID 토큰 검색

사용자 또는 기기가 성공적으로 로그인하면 Firebase에서 고유하게 식별하는 해당 ID 토큰을 생성하고 Firebase 실시간 데이터베이스 및 Cloud Storage와 같은 여러 리소스에 대한 액세스 권한을 부여합니다. 해당 ID 토큰을 재사용하여 사용자 지정 백엔드 서버에서 사용자 또는 장치를 식별할 수 있습니다. 클라이언트에서 ID 토큰을 검색하려면 사용자가 로그인되어 있는지 확인한 다음 로그인한 사용자로부터 ID 토큰을 가져옵니다.

iOS+

오브젝티브-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
          // ...
}];
빠른
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
  // ...
}

기계적 인조 인간

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();
            }
        }
    });

단일성

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 != nullptr) {
  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
});

ID 토큰이 있으면 해당 JWT를 백엔드로 보내고 Firebase Admin SDK를 사용하거나 Firebase가 기본적으로 지원하지 않는 언어로 서버를 작성한 경우 타사 JWT 라이브러리를 사용하여 유효성을 검사할 수 있습니다.

Firebase Admin SDK를 사용하여 ID 토큰 확인

Firebase Admin SDK에는 ID 토큰을 확인하고 디코딩하는 기본 제공 메서드가 있습니다. 제공된 ID 토큰이 올바른 형식이고 만료되지 않고 올바르게 서명된 경우 메서드는 디코딩된 ID 토큰을 반환합니다. 디코딩된 토큰에서 사용자 또는 장치의 uid 를 가져올 수 있습니다.

Admin SDK 설정 지침 에 따라 서비스 계정으로 Admin SDK를 초기화하세요. 그런 다음 verifyIdToken() 메서드를 사용하여 ID 토큰을 확인합니다.

노드.js

// idToken comes from the client app
getAuth()
  .verifyIdToken(idToken)
  .then((decodedToken) => {
    const uid = decodedToken.uid;
    // ...
  })
  .catch((error) => {
    // Handle error
  });

자바

// idToken comes from the client app (shown above)
FirebaseToken decodedToken = FirebaseAuth.getInstance().verifyIdToken(idToken);
String uid = decodedToken.getUid();

파이썬

# id_token comes from the client app (shown above)

decoded_token = auth.verify_id_token(id_token)
uid = decoded_token['uid']

가다

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)

씨#

FirebaseToken decodedToken = await FirebaseAuth.DefaultInstance
    .VerifyIdTokenAsync(idToken);
string uid = decodedToken.Uid;

ID 토큰 확인에는 프로젝트 ID가 필요합니다. Firebase Admin SDK는 다음 방법 중 하나를 통해 프로젝트 ID를 얻으려고 시도합니다.

  • SDK가 명시적인 projectId 앱 옵션으로 초기화된 경우 SDK는 해당 옵션의 값을 사용합니다.
  • SDK가 서비스 계정 자격 증명으로 초기화된 경우 SDK는 서비스 계정 JSON 개체의 project_id 필드를 사용합니다.
  • GOOGLE_CLOUD_PROJECT 환경 변수가 설정되면 SDK는 해당 값을 프로젝트 ID로 사용합니다. 이 환경 변수는 App Engine 및 Compute Engine과 같은 Google 인프라에서 실행되는 코드에 사용할 수 있습니다.

타사 JWT 라이브러리를 사용하여 ID 토큰 확인

백엔드가 Firebase Admin SDK에서 지원하지 않는 언어로 되어 있는 경우에도 ID 토큰을 확인할 수 있습니다. 먼저 해당 언어에 대한 타사 JWT 라이브러리를 찾습니다 . 그런 다음 ID 토큰의 헤더, 페이로드 및 서명을 확인합니다.

ID 토큰의 헤더가 다음 제약 조건을 준수하는지 확인합니다.

ID 토큰 헤더 클레임
alg 연산 "RS256"
kid 키 ID https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com 에 나열된 공개 키 중 하나와 일치해야 합니다.

ID 토큰의 페이로드가 다음 제약 조건을 준수하는지 확인합니다.

ID 토큰 페이로드 클레임
exp 만료 시간 미래에 있어야 합니다. 시간은 UNIX epoch 이후 초 단위로 측정됩니다.
iat 발행 시간 과거여야 합니다. 시간은 UNIX epoch 이후 초 단위로 측정됩니다.
aud 청중 해당 프로젝트 콘솔의 URL에서 찾을 수 있는 Firebase 프로젝트의 고유 식별자인 Firebase 프로젝트 ID여야 합니다.
iss 발급사 "https://securetoken.google.com/<projectId>" 여야 합니다. 여기서 <projectId> 는 위의 aud 에 사용된 것과 동일한 프로젝트 ID입니다.
sub 주제 비어 있지 않은 문자열이어야 하며 사용자 또는 장치의 uid 여야 합니다.
auth_time 인증 시간 과거여야 합니다. 사용자가 인증한 시간입니다.

마지막으로 ID 토큰이 토큰의 kid 클레임에 해당하는 개인 키로 서명되었는지 확인합니다. https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com 에서 공개 키를 가져오고 JWT 라이브러리를 사용하여 서명을 확인합니다. 공개 키를 새로 고칠 때를 알기 위해 해당 끝점에서 응답의 Cache-Control 헤더에 있는 max-age 값을 사용합니다.

위의 모든 검증에 성공하면 ID 토큰의 제목( sub )을 해당 사용자 또는 장치의 uid 로 사용할 수 있습니다.