2026年8月5日水曜日

Oracle Backend for Firebaseを組み込んだアプリケーションをAuth0で認証する

先日の記事「Oracle Backend for Firebaseを組み込んだアプリケーションをGoogleアカウントで認証する」では、Googleアカウントでの認証を実装しました。本記事ではAuth0のOpenID Connectによる認証を実装してみます。

Auth0のOpenID Connectによる認証を組み込むアプリケーションとして、以下のLiveLabsを実施して作成したアプリケーションを使用します。
Googleアカウントによるユーザー認証の記事で少し説明していますが、Oracle Backend for Firebase(Fusabase)のGoogleAuthProviderは、OAuthProviderと同じ扱いができるように作成されています。そのため、それぞれのクライアントに記述されているユーザー認証のコードにあるGoogleAuthProviderを、OAuthProvider("プロバイダ名")に置き換えることで、Auth0(OpenID Connect)による認証に変わります。


Auth0のOpenID Connectプロバイダを構成する



最初にリダイレクトURIを確認します。

Oracle Backend for Firebaseのコンソールにサインインし、AuthenticationSocial loginを開きます。

Add new providerOpenID Connectを実行します。


プロバイダをEnableに切り替えます。Enableにすると、リダイレクトURIが表示されます。なぜかCopy URIボタンが効かない(サイトをHTTPで構成しているからかもしれません)ため、表示されているリダイレクトURIを選択して、クリップボードにコピーします。

Client IdおよびClient Secretは、Auth0にアプリケーションを作成することにより得られる値なので現時点では不明です。キャンセルをクリックし、ドロワーを閉じます。


Auth0のコンソールでの作業に移ります。

サイドメニューよりアプリケーションを開き、アプリケーションの作成を実行します。


作成するアプリケーションの名前fusabaseとしました。種類一般的なWebアプリケーションを選択します。

作成をクリックします。


アプリケーションが作成されます。設定タブを開きます。

ドメインクライアントIDクライアントシークレットの値をコピーします。これらの値は、Oracle Backend for FirebaseにAuth0をプロバイダとして作成する際に設定します。


下スクロールし、許可するCallback URLとして先ほどOracle Backend for Firebaseのコンソールより確認したリダイレクトURIを設定します。

以上で変更を保存します。


Oracle Backend for Firebaseのコンソールに戻り、Authenticationを開きます。

Add new providerOpenID Connectを実行します。

作成するプロバイダの名前(Name)auth0とします。ここで設定した名前auth0に接頭辞としてoidc_が付けられたoidc_auth0が、作成されるプロバイダの名前になります。Enableをオフにすれば実質的には同じなのですが、作成したプロバイダを削除する方法が無い(見つけられなかった)、また、名前の変更もできないため、名前は注意して決めることをお勧めします。

Auth0のOpenID Connectの構成URLは、ドメインの値から以下になります。

https://[ドメイン]/.well-known/openid-configuration

構成ファイルからissuerの値を取り出すために、以下のコマンドを実行します。

curl -s https://[ドメイン]/.well-known/openid-configuration | jq -r .issuer

~ % curl -s https://[ドメイン]/.well-known/openid-configuration | jq -r .issuer

https://[ドメイン]/

~ % 


この値がIssuer (URL)に設定する値になります。Auth0の場合は概ねhttps://[ドメイン]/になります。末尾の/(スラッシュ)が無くてもプロバイダとして作成できますが、認証する際にInvalid Tokenというエラーが発生します。そのため、Issuer (URL)の末尾には必ず / (スラッシュ) を付けるようにします。

Auth0のAuthorization Endpointは以下のコマンドで確認できます。

curl -s https://[ドメイン]/.well-known/openid-configuration | jq -r .authorization_endpoint

 ~ % curl -s https://[ドメイン]/.well-known/openid-configuration | jq -r .authorization_endpoint

https://[ドメイン]/authorize

~ %


現時点(2026年8月5日時点)のOracle Backend for Firebaseでは、Issuer (URL)authorizeを付けたURLが、Authorization Endpointであることを期待しています。Auth0のAuthorization Endpointはその形式ですが、大抵のIdP(Microsoft Entra ID、Okta Integrator、Oracle IAMなど)は異なる形式であるため、ユーザー認証が正しく行われません(Authorization Endpointにアクセスした時点で404 Not Foundが発生する)。これらのIdPを使用するには、今後の対応を待つ必要があります。

App IDには、Auth0に作成したアプリケーションのクライアントIDを、App secretには、クライアントシークレットを設定します。

以上を設定し、Saveを実行します。


以上で、Auth0を使ったOpenID Connectによる認証が有効になりました。

それぞれのアプリケーションにOpenID Connectによる認証を組み込む手順は、Googleアカウント(こちらの記事)と違いはありません。とはいえ、Googleアカウントの手順を読んでOpenID Connectに置き換えるのも分かりにくいので、ほとんど同じですがOpenID Connectによる認証の組み込み手順を以下に記述します。


Web/JavaScriptアプリケーションを認証する



JavaScript SDKのAuthenticationモジュールの説明は、以下に記載されています。

LiveLabsのBuild a Recipe Web App with Oracle Backend for Firebaseを実施して作成されたアプリケーションを元に作業します。

Sign inボタンをクリックすると表示されるパネルのSign inCreate accountの間に、Sign in with OIDCというボタンを追加します。


index.htmlsignInButtonの下に、以下の一行を挿入します。ページに表示されるボタンとして、Sign in with OIDCが追加されます。

<button id="signInWithOIDCButton" class="btn btn-outline" type="button">Sign in with OIDC</button>


scripts/app.jsの先頭にあるimport文を更新します。fusabase/authより追加で、OAuthProvidersignInWithPopupをインポートします。
import {
  GoogleAuthProvider,
  OAuthProvider,
  signInWithPopup,
  createUserWithEmailAndPassword,
  getAuth,
  onAuthStateChanged,
  signInWithEmailAndPassword,
  signOut
} from "fusabase/auth";
ボタンsignInWithOIDCButtonを、オブジェクトelの属性として含めます。

signInButtonの下に、以下の一行を挿入します。

signInWithOIDCButton: document.querySelector("#signInWithOIDCButton"),


ボタンsignInWithOIDCButtonをクリックしたときに実行されるコードを追加します。見つけやすいように、signInButtonのイベントリスナー定義の下の配置します。
  el.signInWithOIDCButton.addEventListener("click", () => {
    runAction("Signed in with OIDC.", async () => {
      // ── Sign in with OIDC ─────────
      const provider = new OAuthProvider("oidc_auth0");
      const userCredential = await signInWithPopup(auth, provider);
      // console.log(userCredential);
    });
  });

以上でアプリケーションの更新は完了です。

RecipeShareのアプリケーションにアクセスし、Sign In with OIDCを実行します。



Auth0のサインイン画面がポップアップします。サインインするアカウント情報を入力します。


Auth0のアプリケーションfusabaseへの接続を受け入れます。


Auth0でのサインインに成功すると、メール・アドレスが表示されます。


以上で、Web/JavaScriptアプリケーションを、Auth0で認証することができました。

Auth0でユーザー認証すると、初回の認証時にOracle Backend for Firebaseにアカウントが作成されます。


すでに異なるプロバイダで同名のアカウントが作成済みの場合、Error signing user through IdPというメッセージが表示され、サインインに失敗します。その場合は作成されているアカウントを削除しておく必要があります。




iOS/Swiftアプリケーションを認証する



iOS SDKのAuthenticationモジュールの説明は、以下に記載されています。

LiveLabsのBuild a Recipe iOS App with Oracle Backend for Firebaseを実施して作成されたアプリケーションを元に作業します。

Services/AuthService.swiftに、Auth0でサインインするファンクションsignInWithOIDCを追加します。ファンクションsignInの下に配置します。
    /// Sign in with OIDC
    func signInWithOIDC() async throws {
        isLoading = true
        errorMessage = nil
        defer { isLoading = false }

        do {
            _ = try await FusabaseAuth.auth().signIn(with: OAuthProvider(providerID: "oidc_auth0"))
        } catch {
            errorMessage = error.localizedDescription
            throw error
        }
    }

Views/AuthView.swiftに、追加したファンクションsignInWithOIDCを呼び出すボタンSign In With OIDCを追加します。

AuthView.swiftの末尾に、アクションとしてsignInWithOIDCを追加します。
    // MARK: - Actions

    private func signInWithOIDC() {
        Task {
            do {
                try await authService.signInWithOIDC()
            } catch {
                // AuthService surfaces the message via `errorMessage`; nothing else to do.
            }
        }
    }

アクションsignInWithOIDCを呼び出すボタンを追加します。sign-upとsign-inを切り替えるボタン(表示はリンク)の下に配置します。
            // Sign In With OIDC
            Button(action: signInWithOIDC) {
                HStack {
                    if authService.isLoading {
                        ProgressView()
                            .controlSize(.small)
                            .padding(.trailing, 4)
                    }
                    Text("Sign In with OIDC")
                        .fontWeight(.semibold)
                        .frame(maxWidth: .infinity)
                }
            }
            .buttonStyle(.borderedProminent)
            .controlSize(.large)
            .disabled(authService.isLoading)

以上でアプリケーションの更新は完了です。

RecipeShareのアプリケーションを実行します。Sign In with OIDCのボタンが追加されています。

Sign In with OIDCをクリックします。


Auth0のサインイン画面が表示されます。Auth0のアカウントを入力します。

Auth0のアカウントの構成によると思いますが、色々な方法で本人確認を求められます。


Auth0のアプリケーションfusabaseへの接続を受け入れます。


Auth0のサインインに成功し、登録されているレシピの一覧が表示されます。


以上で、iOS/Swiftアプリケーションを、Auth0で認証することができました。


Android/Javaアプリケーションを認証する



Android SDKのAuthenticationモジュールの説明は、以下に記載されています。

LiveLabsのTitle Build a Recipe Android App with Oracle Backend for Firebaseを実施して作成されたアプリケーションを元に作業します。

Fusabase Android SDKの説明には記載されていませんが、Fusabase Android SDKのAuthenticationモジュールには、startActivityForSignInWithProviderが含まれています。このメソッドを使って、Googleアカウントによるサインインを実装します。

掲載しているほとんどのコードは、Claude Opus 5に生成させています。

AuthRepository.javaに以下の2つのファンクションを追加します。
    /**
     * Sign in with OIDC.
     */
    public void signInWithOIDC(Activity activity) {
        isLoading.setValue(true);
        errorMessage.setValue(null);
        OAuthProvider.Builder builder = OAuthProvider.newBuilder("oidc_auth0");
        OAuthProvider provider = builder.build();
        auth.startActivityForSignInWithProvider(activity, provider)
                .addOnSuccessListener(result -> isLoading.postValue(false))
                .addOnFailureListener(error -> {
                    isLoading.postValue(false);
                    errorMessage.postValue(error.getMessage());
                });
    }
    public void resumePendingSocialLogin() {
        Task<AuthResult> pending = auth.getPendingAuthResult();
        if (pending == null) {
            isLoading.postValue(false);
            return;
        }
        pending.addOnSuccessListener(result -> isLoading.postValue(false))
                .addOnFailureListener(error -> {
                    isLoading.postValue(false);
                    errorMessage.postValue(error.getMessage());
                });
    }

これらのファンクションが使用しているクラスをインポートするように、ファイルの先頭に以下のインポート文を追加します。
/* Sign in with Google */
import android.app.Activity;
import com.oracle.mobile.fusabase.auth.GoogleAuthProvider;
import com.oracle.mobile.fusabase.auth.OAuthProvider;
import com.oracle.mobile.fusabase.task.Task;
import com.oracle.mobile.fusabase.auth.AuthResult;

サインインの画面にボタンSign in with OIDCを追加します。

res/values/strings.xmlに以下の1行を挿入します。ボタンのラベルとなる文字列です。

<string name="auth_button_oidc">Sign in with OIDC</string>


サインインの画面にボタンSign in with OIDCを追加します。

res/layout/fragment_auth.xmlを開き、以下の要素をボタンSign inの下に配置します。
        <com.google.android.material.button.MaterialButton
            android:id="@+id/oidcButton"
            style="@style/Widget.Material3.Button.OutlinedButton"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="@dimen/spacing_sm"
            android:text="@string/auth_button_oidc" />

AuthFragment.javaを開き、ボタンのアクション(クリック)とAuthRepository.javaに記載したファンクションの紐付けを行います。

ボタンSign in with OIDC(oidcButton)をクリックしたときに、ファンクションsignInWithOIDCが呼び出されるように、以下のコードを追加します。
        binding.oidcButton.setOnClickListener(v -> {
            binding.errorText.setVisibility(View.GONE);
            App.get().auth().signInWithOIDC(requireActivity());
        });
他のボタンと同様に、ページのロード中はクリックを無効にします。以下の1行を、App.get().auth().getIsLoading().observe内に含めます。

binding.oidcButton.setEnabled(!active);


resumePendingSocialLoginを呼び出すコードを、AuthFragment.javaの末尾に追加します。
    @Override
    public void onResume() {
        super.onResume();
        App.get().auth().resumePendingSocialLogin();
    }

main/AndroidManifest.xmlに記載されているSocialLoginActivityの設定を更新します。

android:launchMode="singleTop"を追加し、android:schemeとして、baasmobileで始まるapp_id(英子文字)を文字列として与えます。以下はandroid:schemeの例です。app_idは、作成したアプリケーションごとに異なります。

baasmobile581fb7467326f5b9e063020012ac0157
        <activity
            android:name="com.oracle.mobile.fusabase.auth.SocialLoginActivity"
            android:exported="true"
            android:launchMode="singleTop">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="baasmobile581fb7467326f5b9e063020012ac0157" />
            </intent-filter>
        </activity>


Auth0によるユーザー認証の実装については以上で完了です。

Androidシミュレータを使って動作確認をするにあたって、ords_hostに10.0.2.2として仮想ネットワークを設定していると、Auth0によるユーザー認証ができません。コールバック・アドレスはHTTPSで保護されているかlocalhostである必要があります。

そのため、main/fusabase-config.jsonords_hostでのホスト指定を、10.0.2.2からlocalhostに戻します。


AndroidシミュレータからORDSに直接接続する代わりに、adb - Android Debug Bridgeを使ってホスト上のTCPポート8181を、シミュレータから見たlocalhost:8181に割り当てます。

~/Library/Android/sdk/platform-tools/adb reverse tcp:8181 tcp:8181
~/Library/Android/sdk/platform-tools/adb reverse --list

adbへのパスは、Android Studioをインストールした環境によって、異なる可能性があります。

% ~/Library/Android/sdk/platform-tools/adb reverse tcp:8181 tcp:8181

% ~/Library/Android/sdk/platform-tools/adb reverse --list

host-10 tcp:8181 tcp:8181


% 


以上で、すべての設定が完了しました。

RecipeShareのアプリケーションを実行します。Sign in with OIDCのボタンが追加されています。

Sign in with OIDCをクリックします。


Auth0のサインイン画面が表示されます。Auth0のアカウントを入力します。

Auth0のアカウントの構成によると思いますが、色々な方法で本人確認を求められます。


Auth0のアプリケーションfusabaseへの接続を受け入れます。


最終的にAuth0による認証が成功すると、登録されているレシピの一覧が表示されます。


以上で、Android/Javaアプリケーションを、Auth0で認証することができました。