ラベル Google の投稿を表示しています。 すべての投稿を表示
ラベル Google の投稿を表示しています。 すべての投稿を表示

2026年8月4日火曜日

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

Oracle Backend for Firebase(Fusabase)は、Google、Facebook、GitHubといったソーシャル・ログイン(Social login)および、外部IDプロバイダーによるログイン(OpenID Connect)をサポートしています。

本記事では、Fusabase SDKに含まれるAuthenticationモジュールをアプリケーションに組み込み、Social loginとして提供されているGoogleを構成して、アプリケーションのユーザー認証を行なってみます。


Authentication typeを構成することにより、外部のプロバイダーを使用したユーザー認証を実装することもできます。こちらの構成については、また別の機会に確認したいと思います。

注) Authentication typeにAdvancedを選択し、IDCSとしてOracle IAMを構成する場合、IAMの機能としてEnd-user self-registrationが必要です。Oracle IAMのIdentity Domain TypeがFreeだと、End-user self-registrationはサポートされていません(IAM Identity Domain Typesの表を参照)。そのため、Oracle Backend for Firebaseの組み込みの認証タイプ(BASIC)を変更し、AdvancedIDCSとしてOracle IAMを構成するには、有料のサブスクリプションが必要になります。

Googleアカウントによるユーザー認証を組み込むアプリケーションとして、以下のLiveLabsを実施して作成したアプリケーションを使用します。


Googleプロバイダを構成する



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

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

GoogleActionを実行します。


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

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


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

プロジェクトが作成されていることを前提とします。

APIとサービス認証情報を開きます。


認証情報の作成から、OAuthクライアントIDを選択します。


Google Auth Platformクライアントの作成に移ります。

アプリケーションの種類としてウェブアプリケーションを選択します。名前fusabaseとしました。

承認済みのリダイレクトURIとして、先ほどOracle Backend for Firebaseのコンソールで確認したリダイレクトURIを設定します。

以上で作成します。


OAuthクライアントが作成されます。クライアントIDクライアントシークレットが表示されるので、これらをコピーします。JSONをダウンロードしておくのも良いでしょう。

OKをクリックしてダイアログを閉じます。


OAuthクライアントとしてfusabaseが作成されます。


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

Social loginGoogleの設定を更新します。Googleに作成したOAuthクライアントfusabaseのクライアントIDクライアントシークレットを設定します。

プロバイダーをEnableにし、Saveします。


以上で、Googleアカウントによるソーシャル・ログインが有効になりました。


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



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

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

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


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

<button id="signInWithGoogleButton" class="btn btn-outline" type="button">Sign in with Google</button>


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

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

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


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

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

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


Googleでログインの画面がポップアップします。ログインするGoogleアカウントを選択します。


アプリケーション名として表示されているRecipeShareは、Google Auth Platformブランディングで設定しています。


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


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

Googleアカウントでユーザー認証すると、初回の認証時に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に、GoogleアカウントでサインインするファンクションsignInWithGoogleを追加します。ファンクションsignInの下に配置します。
    /// Sign in with Google
    func signInWithGoogle() async throws {
        isLoading = true
        errorMessage = nil
        defer { isLoading = false }

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

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

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

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

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

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

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

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


Googleでログインの画面が表示されます。Googleアカウントを入力し、Enterを送信します。


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


RecipeShareに再ログインしようとしています。と表示されたので次へ進みます。


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


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


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つのファンクションを追加します。
    /**
     * Signs in with Google. The SDK opens a Custom Tab for the OAuth flow, so an
     * Activity is required. The result arrives through the auth state listener
     * once the browser redirects back to SocialLoginActivity.
     */
    public void signInWithGoogle(Activity activity) {
        isLoading.setValue(true);
        errorMessage.setValue(null);
        auth.startActivityForSignInWithProvider(activity, new GoogleAuthProvider(auth))
                .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.task.Task;
import com.oracle.mobile.fusabase.auth.AuthResult;

本家のFirebase Authentication SDKでは、startActivityForSignInWithProvider() は主に OAuthProvider(Apple、GitHub、Microsoft、OIDC など)の認証で使用するAPIとして紹介されています。Googleアカウントによるサインインについては、現在のFirebase公式ドキュメントでは Credential Manager を使用する方法が推奨されています。

Oracle Backend for Firebase (Fusabase) は、Oracle Databaseのクライアント・アプリケーションを作成する際に、Firebaseの開発体験を提供するSDKです。作成するアプリケーションは、あくまでOracle Databaseのクライアント・アプリケーションなので、ユーザー認証もエンタープライズ向けのOpenID Connectによる認証が主になるでしょう。そのため、Googleアカウントによる認証もCredential Managerを使わずに実装しました。

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

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

<string name="auth_button_google">Sign in with Google</string>


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

res/layout/fragment_auth.xmlを開き、以下の要素をボタンSign inの下に配置します。
        <com.google.android.material.button.MaterialButton
            android:id="@+id/googleButton"
            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_google" />

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

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

binding.googleButton.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>


Googleアカウントによるユーザー認証の実装については以上で完了です。

Androidシミュレータを使って動作確認をするにあたって、ords_hostに10.0.2.2として仮想ネットワークを設定していると、Googleアカウントによるユーザー認証ができません。コールバック・アドレスは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 Googleのボタンが追加されています。

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


アカウントの選択画面に移ります。すでにサインインしたことのあるアカウントを選択するか、Use another accountを選択して、新たにサインインするユーザーを指定します。


アカウントの設定に応じた本人確認の手順が要求されます。

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


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

2026年7月16日木曜日

Autonomous AI Databaseのデータベース・ツールを外部認証する - GCP編

本記事では、Google Cloud Platformを外部アイデンティティ・プロバイダーとした設定手順を紹介します。

これまでに紹介している、外部アイデンティティ・プロバイダーの構成手順です。
ChatGPTにMicrosoft Entra IDの作業手順をもとにGCPの手順を生成させたところ、指定できない引数や存在しないAPIの呼び出しが手順に含まれていました。また、そのようなAPI呼び出しに公式ドキュメントがリンクされていました。

DBMS_CLOUD_ADMIN.ENABLE_EXERNAL_AUTHENTICATIONtypeGCPは指定できません。


Database Actionsを利用できるようにするのは、ORDS_ADMIN.ENABLE_SCHEMAです。DBMS_CLOUD_ADMIN.ENABLE_DATABASE_WEB_ACCESSというAPIは存在しません。


実際に検証された手順を学習していないと、AIも間違うようです。AIの間違いを減らすために、Googleについても構成手順を確認しました。

これまでと同様に、作業に使用するデータベースとして、以下の構成のAutonomous AI Databaseを使用します。

データベース名SALESADBワークロード・タイプレイクハウスデータベースのバージョン19cです。

手元の作業ディレクトリは、salesadb_gcpとします。

GCPのアプリケーションに設定するリダイレクトURIの形式です。

https://[パブリック・アクセスURLのホスト部]/adb/auth/v1/connect/gcp/callback


Google Cloud Platformの構成



Google Cloudのコンソールにサインインします。プロジェクトが作成されていることを前提とします。

APIとサービス認証情報を開きます。


認証情報を作成をクリックし、OAuthクライアントIDを選択します。


アプリケーションの種類としてウェブ・アプリケーションを選択します。名前SALESADBとします。

承認済みのリダイレクトURIとして、以下の形式のリダイレクトURIを設定します。

https://[パブリック・アクセスURLのホスト部]/adb/auth/v1/connect/gcp/callback

以上で作成します。


ダイアログが開きます。

クライアントIDクライアントシークレットをコピーし、OKをクリックしてダイアログを閉じます。


公開ステータステスト中にした状態で、接続確認を実施します。

以上で、Google Cloud PlatformにOAuthクライアントが作成されました。



データベース・ツールの外部認証の構成




SALESADBに管理者ユーザーADMINで接続します。接続にはSQLclを使用します。

sql admin@salesadb_low

Google Cloud Platformによる外部認証を有効にします。クライアントIDクライアントシークレトを、先ほどコピーした値に置き換えます。
BEGIN
   DBMS_CLOUD_FUNCTION_ADMIN.CREATE_IDP(
      idp_name       => 'GCP',
      client_id      => '<client-id>',
      client_secret  => '<client-secret>',
      params         => JSON_OBJECT(
                           'discovery_url' VALUE
                           'https://accounts.google.com/.well-known/openid-configuration'
                           ));
END;
/

SQL> BEGIN

  2     DBMS_CLOUD_FUNCTION_ADMIN.CREATE_IDP(

  3        idp_name       => 'GCP',

  4        client_id      => '****************.apps.googleusercontent.com',

  5        client_secret  => '****************************************',

  6        params         => JSON_OBJECT(

  7                             'discovery_url' VALUE

  8                             'https://accounts.google.com/.well-known/openid-configuration'

  9                             ));

 10  END;

 11* /


PL/SQLプロシージャが正常に完了しました。


SQL> 


設定を確認します。

select * from dba_list_idp;

SQL> select * from dba_list_idp;


IDP_ID                                                                           IDP_NAME    CLIENT_ID                                                                   PARAMS                                                                              

________________________________________________________________________________ ___________ ___________________________________________________________________________ ___________________________________________________________________________________ 

GCP-7532****-****-****-****-********3eb5-b9a9****-****-****-****-********ff3d    GCP         4956********-***********************************.apps.googleusercontent.com    {"discovery_url":"https://accounts.google.com/.well-known/openid-configuration"}    


SQL> 


以上で、外部アイデンティティ・プロバイダーとしてGoogle Cloud Platformが登録されました。

データベース・ユーザーとしてWKSP_APEXDEVを作成します。このユーザーは、Oracle APEXのワークスペースAPEXDEVのデフォルト・パーシング・スキーマとして使用します。

データベース・ユーザーWKSP_APEXDEVには、Google Cloud Platformのユーザーを割り当てます。GCPについては、データベース・ユーザーに割り当てられるのはユーザーに限定され、グループやロールを割り当てる機構は提供されていません。

WKSP_APEXDEVには最低限の権限のみを割り当ています。

create user wksp_apexdev identified globally as 'GCP_USER=<ユーザー名>';
alter user wksp_apexdev quota 25m on data;
grant create session to wksp_apexdev;
grant create table, create view, create procedure, create sequence to wksp_apexdev;

SQL> create user wksp_apexdev identified globally as 'GCP_USER=y_____@______.com';


User WKSP_APEXDEVは作成されました。


SQL> alter user wksp_apexdev quota 25m on data;


User WKSP_APEXDEVが変更されました。


SQL> grant create session to wksp_apexdev;


Grantが正常に実行されました。


SQL> grant create table, create view, create procedure, create sequence to wksp_apexdev;


Grantが正常に実行されました。


SQL> 


スキーマWKSP_APEXDEVREST有効にします。ORDS別名apexdev(これがAPEXワークスペース名として扱われます)を割り当てます。
BEGIN
    ORDS_ADMIN.ENABLE_SCHEMA(
        p_enabled             => TRUE,
        p_schema              => 'WKSP_APEXDEV',
        p_url_mapping_type    => 'BASE_PATH',
        p_url_mapping_pattern => 'apexdev',
        p_auto_rest_auth      => FALSE);
END;
/

SQL> BEGIN

  2      ORDS_ADMIN.ENABLE_SCHEMA(

  3          p_enabled             => TRUE,

  4          p_schema              => 'WKSP_APEXDEV',

  5          p_url_mapping_type    => 'BASE_PATH',

  6          p_url_mapping_pattern => 'apexdev',

  7          p_auto_rest_auth      => FALSE);

  8  END;

  9* /


PL/SQLプロシージャが正常に完了しました。


SQL> 


外部認証が有効になっていないとデータベース・ツールに接続できない(404 Not Foundが返される)ため、OCI_IAMで外部認証を有効にします。
BEGIN
   DBMS_CLOUD_ADMIN.ENABLE_EXTERNAL_AUTHENTICATION(
      type  => 'OCI_IAM',
      force => TRUE
   );
END;
/

SQL> BEGIN

  2     DBMS_CLOUD_ADMIN.ENABLE_EXTERNAL_AUTHENTICATION(

  3        type  => 'OCI_IAM',

  4        force => TRUE

  5     );

  6  END;

  7* /


PL/SQLプロシージャが正常に完了しました。


SQL> 


以上で、データベース・ツールの認証にGoogle Cloud Platformを使用できるようになりました。


データベース・ツールへの接続



Autonomous AI Databaseに接続し、使用するツールとしてSQL Developer Webを選択します。


SSOでサインインをクリックします。


外部アイデンティティ・プロバイダーとしてGCPを選択します。


サインインするGoogleアカウントを選択します。サインインの確認を求められます。


HTTPのステータス・コードとして404 Not Foundが返されました。これは、ORDS別名として設定したapexdevではなく、スキーマ名がURLに含まれるために発生しています。

ブラウザに表示されているURLの/ords/wksp_apexdev/_sdw/の部分を/ords/apexdev/_sdw/に変更して、URLにアクセスします。

URLを変更すると、データベース・アクションに接続されます。


Google Cloud Platformで認証したユーザーにて、データベース・ツールに接続できました。



Oracle APEXへの接続




GUIでの作業は、これまで紹介しているOracle IAM、Microsoft Entra IDおよびOktaと同じ作業になります。すこし手順を変えて、同じ作業をスクリプトで実施します。

APEXのワークスペースとしてAPEXDEVを追加します。APEX_INSTANCE_ADMIN.ADD_WORKSPACEを呼び出します。
begin
apex_instance_admin.add_workspace(
    p_workspace => 'APEXDEV',
    p_primary_schema => 'WKSP_APEXDEV'
);
end;
/
ワークスペースが作成されたら、管理者ユーザーを追加します。

APEX_UTIL.SET_WORKSPACEを呼び出し、対象のワークスペースに切り替えてから、APEX_UTIL.CREATE_USERを呼び出します。
begin
apex_util.set_workspace('APEXDEV');
apex_util.create_user(
    p_user_name        => upper('<Googleユーザー>'),
    p_web_password     => '<パスワード>',
    p_developer_privs  => 'ADMIN:CREATE:DATA_LOADER:EDIT:HELP:MONITOR:SQL',
    p_email_address    => '<Googleユーザー>',
    p_default_schema   => 'WKSP_APEXDEV',
    p_change_password_on_first_use => 'N'
);
end;
/
commit;
exit
以上で、APEXワークスペースと管理者ユーザーの追加ができました。

APEXへの接続を確認します。

ORDSのランディング・ページより、Oracle APEX実行します。


GCPを選択します。


Googleでログインします。


Googleでサインインしたユーザーに、ワークスペースAPEXDEVが紐づいています。

APEXDEVを選択します。


APEXにサインインできました。


以上で、外部アイデンティ・プロバイダーで認証したユーザーで、Oracle APEXの開発ツールに接続できました。

Autonomous AI Databaseでは、コンソールで管理者ユーザーや開発者ユーザーを作成すると、対応したデータベース・ユーザーが作成されます。APEX_UTIL.CREATE_USERを呼び出して作成したユーザーはその限りではなく、対応するデータベース・ユーザーは作成されていません。

これが仕様なのか不明ですが、外部アイデンティティ・プロバイダーによるユーザー認証を構成する場合は、データベース・ユーザーが作成されない方がメリットがあります。

今回の記事は以上になります。