Firebase SDK を使用してウェブベースの汎用 OAuth ログインをアプリに統合し、エンドツーエンドのログインフローを実行することで、ユーザーが Firebase での認証に Microsoft Azure Active Directory などの OAuth プロバイダを使用できるようになります。このフローでは、スマートフォン ベースの Firebase SDK を使用する必要があるため、Android プラットフォームと Apple プラットフォームでのみサポートされます。
始める前に
- Firebase を C++ プロジェクトに追加します。
- Firebase コンソールで [Auth] セクションを開きます。
- [Sign-in method] タブで、[Microsoft] プロバイダを有効にします。
- そのプロバイダのデベロッパー コンソールで取得したクライアント ID とクライアント シークレットをプロバイダ構成に追加します。
- クイックスタート: Azure Active Directory v2.0 エンドポイントを使用してアプリを登録するの手順で、Microsoft OAuth クライアントを登録します。 このエンドポイントは、Azure Active Directory アカウントだけでなく、Microsoft の個人アカウントを使用したログインもサポートしています。Azure Active Directory v2.0 に関する詳細をご確認ください。
- こうしたプロバイダにアプリを登録するときは、必ずプロジェクトの
*.firebaseapp.com
ドメインをアプリのリダイレクト ドメインとして登録してください。
- [保存] をクリックします。
firebase::auth::Auth
クラスへのアクセス
すべての API 呼び出しは Auth
クラスを使用して行われます。- Auth ヘッダー ファイルと App ヘッダー ファイルを追加します。
#include "firebase/app.h" #include "firebase/auth.h"
- 初期化コードで
firebase::App
クラスを作成します。#if defined(__ANDROID__) firebase::App* app = firebase::App::Create(firebase::AppOptions(), my_jni_env, my_activity); #else firebase::App* app = firebase::App::Create(firebase::AppOptions()); #endif // defined(__ANDROID__)
firebase::App
のfirebase::auth::Auth
クラスを取得します。App
とAuth
は、1 対 1 で対応しています。firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);
Firebase SDK を使用したログインフローの処理
Firebase SDK でログインフローを処理する手順は次のとおりです。
Microsoft に適したプロバイダ ID で構成された
FederatedOAuthProviderData
のインスタンスを作成します。firebase::auth::FederatedOAuthProviderData provider_data(firebase::auth::MicrosoftAuthProvider::kProviderId);
省略可: OAuth リクエストと一緒に送信したい追加のカスタム OAuth パラメータを指定します。
// Prompt user to re-authenticate to Microsoft. provider_data.custom_parameters["prompt"] = "login"; // Target specific email with login hint. provider_data.custom_parameters["login_hint"] = "user@firstadd.onmicrosoft.com";
Microsoft がサポートするパラメータについては、Microsoft の OAuth に関するドキュメントをご覧ください。
setCustomParameters()
で Firebase の必須パラメータを渡すことはできません。該当するパラメータは、client_id、response_type、redirect_uri、state、scope、response_mode です。Azure AD テナントのわかりやすいドメイン名またはテナントの GUID 識別子を使用して、特定の Azure AD テナントのユーザーのみがアプリケーションにログインするようにできます。これは、カスタム パラメータ オブジェクトの「tenant」フィールドを指定することによって実行できます。
// Optional "tenant" parameter in case you are using an Azure AD tenant. // eg. '8eaef023-2b34-4da1-9baa-8bc8c9d6a490' or 'contoso.onmicrosoft.com' // or "common" for tenant-independent tokens. // The default value is "common". provider_data.custom_parameters["tenant"] ="TENANT_ID";
省略可: 認証プロバイダにリクエストする、基本的なプロフィール以外の追加の OAuth 2.0 スコープを指定します。
provider_data.scopes.push_back("mail.read"); provider_data.scopes.push_back("calendars.read");
詳しくは、Microsoft のアクセス許可と同意に関するドキュメントをご覧ください。
プロバイダのデータを構成したら、それを使用して
FederatedOAuthProvider
を作成します。// Construct a FederatedOAuthProvider for use in Auth methods. firebase::auth::FederatedOAuthProvider provider(provider_data);
Auth プロバイダ オブジェクトを使用して Firebase での認証を行います。こうすると、他の FirebaseAuth オペレーションとは異なり、ユーザーが認証情報を入力できるウェブビューをポップアップ表示して UI を制御することになります。
ログインフローを開始するには、
SignInWithProvider
を呼び出します。firebase::Future<firebase::auth::AuthResult> result = auth->SignInWithProvider(provider_data);
その後、プログラムは待機するか、Future にコールバックを登録します。
OAuth アクセス トークンを使用して、Microsoft Graph API を呼び出せます。
Firebase Auth でサポートされている他のプロバイダとは異なり、Microsoft では写真の URL が提供されないため、代わりにプロフィール写真のバイナリデータを Microsoft Graph API を介してリクエストする必要があります。
上記の例ではログインフローを中心に説明していますが、
LinkWithProvider
を使用して Microsoft Azure Active Directory プロバイダを既存のユーザーにリンクすることもできます。たとえば、複数のプロバイダを同じユーザーにリンクして、どれでもログインできるようにすることができます。firebase::Future<firebase::auth::AuthResult> result = user.LinkWithProvider(provider_data);
同じパターンを
ReauthenticateWithProvider
でも使用できます。これは、ログインしてから短時間のうちに行うことが求められる機密性の高いオペレーションのための、最新の認証情報の取得に使用できます。firebase::Future<firebase::auth::AuthResult> result = user.ReauthenticateWithProvider(provider_data);
その後、アプリケーションは待機するか、Future にコールバックを登録します。
次のステップ
ユーザーが初めてログインすると、新しいユーザー アカウントが作成され、ユーザーがログイン時に使用した認証情報(ユーザー名とパスワード、電話番号、または認証プロバイダ情報)にアカウントがリンクされます。この新しいアカウントは Firebase プロジェクトの一部として保存され、ユーザーのログイン方法にかかわらず、プロジェクトのすべてのアプリでユーザーを識別するために使用できます。
-
アプリでは、
firebase::auth::User
オブジェクトからユーザーの基本的なプロフィール情報を取得できます。firebase::auth::User user = auth->current_user(); if (user.is_valid()) { std::string name = user.display_name(); std::string email = user.email(); std::string photo_url = user.photo_url(); // The user's ID, unique to the Firebase project. // Do NOT use this value to authenticate with your backend server, // if you have one. Use firebase::auth::User::Token() instead. std::string uid = user.uid(); }
Firebase Realtime Database と Cloud Storage のセキュリティ ルールでは、ログイン済みユーザーの一意のユーザー ID を
auth
変数から取得し、それを使用して、ユーザーがアクセスできるデータを制御できます。
既存のユーザー アカウントに認証プロバイダの認証情報をリンクすることで、ユーザーは複数の認証プロバイダを使用してアプリにログインできるようになります。
ユーザーのログアウトを行うには、SignOut()
を呼び出します。
auth->SignOut();