ID トークンを検証する

Firebase クライアント アプリがカスタム バックエンド サーバーと通信する場合、そのサーバーに現在ログインしているユーザーを特定する必要があります。これを安全に行うために、正常なログイン後、ユーザーの ID トークンを HTTPS を使ってサーバーに送信します。次に、サーバー上で ID トークンの完全性と信頼度を確認し、ID トークンの uid を取得します。サーバーで現在ログインしているユーザーを安全に特定するために、この方法で送信された uid を使用できます。

準備

Firebase Admin SDK により ID トークンを確認するには、サービス アカウントが必要です。サービス アカウントで Admin SDK を初期化する方法の詳細については、Admin SDK の設定手順をご覧ください。

クライアントで ID トークンを取得する

ユーザーのログインまたは端末でのログインが成功すると、Firebase で独自の ID トークンが作成され、この ID トークンでユーザーまたは端末を特定し、Firebase Realtime Database や Cloud Storage などのリソースへのアクセスを許可します。この ID トークンは、カスタム バックエンド サーバーのユーザーまたは端末を識別するために再利用できます。クライアントから ID トークンを取得するには、ユーザーがログインしたことを確認してから、ログインしたユーザーから ID トークンを取得します。

iOS

Objective-C

FIRUser *currentUser = [FIRAuth auth].currentUser;
[currentUser getTokenForcingRefresh: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?.getTokenForcingRefresh(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.getToken(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 != nullptr) {
  firebase::Future<std::string> idToken = user->GetToken(true);

  // Send token to your backend via HTTPS
  // ...
}

ウェブ

firebase.auth().currentUser.getToken(/* forceRefresh */ true).then(function(idToken) {
  // Send token to your backend via HTTPS
  // ...
}).catch(function(error) {
  // Handle error
});

ID トークンを取得した後、該当する JWT をバックエンドに送信し、Firebase Admin SDK を使用して、その JWT を検証できます。Firebase でネイティブにサポートされていない言語でサーバーが記述されている場合は、サードパーティの JWT ライブラリを使用して検証することもできます。

Firebase Admin SDK を使用して ID トークンを確認する

Firebase Admin SDK には、ID トークンを確認してデコードするための組み込みのメソッドが用意されています。提供された ID トークンが正しい形式で、期限切れではなく、適切に署名されていれば、メソッドはデコードされた ID トークンを返します。デコードされたトークンからユーザーまたは端末の uid を取得できます。

Admin SDK の設定手順に沿って、サービス アカウントで Admin SDK を初期化してください。その後、verifyIdToken() メソッドを使用して ID トークンを確認します。

Node.js

// idToken comes from the client app (shown above)

admin.auth().verifyIdToken(idToken)
  .then(function(decodedToken) {
    var uid = decodedToken.uid;
    // ...
  }).catch(function(error) {
    // Handle error
  });

Java

// idToken comes from the client app (shown above)

FirebaseAuth.getInstance().verifyIdToken(idToken)
    .addOnSuccessListener(new OnSuccessListener<FirebaseToken>() {
        @Override
        public void onSuccess(FirebaseToken decodedToken) {
            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']

サードパーティの 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 エポック時刻からの秒数です。
iat 発行時 過去の時点であることが必要です。この時間は、UNIX エポック時刻からの秒数です。
aud ユーザー Firebase プロジェクトの ID(Firebase プロジェクトの一意の識別子)であることが必要です。これは、プロジェクトのコンソールの URL で確認できます。
iss 発行元 "https://securetoken.google.com/<projectId>" であることが必要です。<projectId> は、上記の aud で使用された同じプロジェクト ID です。
sub 件名 空ではない文字列、またはユーザーまたは端末の uid であることが必要です。

最後に、トークンの kid 要件に対応する秘密鍵によって ID トークンが署名されたことを確認します。https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com から公開鍵を取得し、JWT ライブラリを使用して署名を確認します。該当エンドポイントからのレスポンスの Cache-Control ヘッダーに含まれる max-age の値を使用して、公開鍵を更新する時期を確認します。

上記のすべての確認が完了したら、対応するユーザーまたは端末の uid として、ID トークンの件名(sub)を使用できます。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。