2023年2月8日水曜日

Googleで認証してGoogle Drive APIを呼び出す

以前にAzure ADで認証した(プロトコルはOpen ID Connect)APEXアプリから、Microsoft Graph APIを呼び出せることを確認しています。同様の確認をGoogleアカウントで行ってみました。

確認のためにAPEXアプリを作成し、Google Drive APIを呼び出しています。MS Graph APIのときと同様に、APIの呼び出しはできました。


以下に実施した作業について記述します。

作成済みのGoogleのプロジェクトで、Google Drive APIを有効にしたところから始めます。


OAuth同意画面を設定します。画面左のメニューより、OAuth同意画面を選択します。

今回はテストなので外部を選びます。Google Workspaceを利用している場合は、内部を選ぶことができるようです。

作成をクリックします。


OAuth同意画面の設定を行います。

アプリ名は任意です。今回はAPEX Google Driveとしています。ユーザーサポートメールは、今回のようなケースではこのコンソールにサインインしている人のメール・アドレスを指定することになると思います。必須ではないようですが、アプリのロゴとなる画像をアップロードしています。

それ以外で必須の情報はデベロッパーの連絡先情報です。このコンソールにサインインしている人のメール・アドレスを指定しています。

今回の作業はAlways FreeのAutonomous Databaseで行っています。そのため承認済みドメインoraclecloudapps.comになります。認証情報の設定時に自動で追加されるため、このページでは必ずしも設定する必要はありません。

保存して次へ進みます。


スコープを設定します。スコープを追加または削除をクリックします。

フィルタGoogle Drive APIを指定します。次のスコープを選択します。

https://www.googleapis.com/auth/drive

画面ではhttps://www.googleapis.com/auth/docsも指定していますが、APEXアプリケーションでは指定しないため不要です。

APIの呼び出しに必要なスコープは、Google Drive APIのReferenceのそれぞれのAPIの説明のAuthorizationのセクションに記載されています。

このスコープは、Googleドライブのすべてのファイルの表示、編集、作成、削除なので、非常に強い権限になります。

スコープを選択して、更新します。


機密性の高いスコープとして、選択したスコープが追加されています。

保存して次へ進みます。


テストユーザーを追加します。

これから作成するAPEXアプリケーションにサインインする開発者を追加します。

保存して次へ進みます。



以上でOAuth同意画面の設定は完了です。


続いて認証情報を設定します。

画面右より認証情報を開き、認証情報の作成からOAuthクライアントIDを選択します。


認証情報の作成に必要な情報を入力します。

アプリケーションの種類ウェブアプリケーションです。選択した種類によって入力する情報が変わります。承認済みのJavaScript生成元承認済みのリダイレクトURIの入力が無い場合は、アプリケーションの種類の選択が間違っています。

アプリケーションの名前は任意です。今回はAPEX Google Driveとしています。

以下はAlways FreeのAutonomous Databaseでの例です。

承認済みのJavaScript生成元は以下のような指定になります。

https://ADBの識別子-データベース名.adb.リージョン名.oraclecloudapps.com

承認済みのリダイレクトURIは以下になります。

https://ADBの識別子-データベース名.adb.リージョン名.oraclecloudapps.com/ords/apex_authentication.callback

APEXのベースURLapex_authentication.callbackを繋げます。

作成をクリックします。


OAuthクライアントを作成しましたとポップアップが開きます。JSONをダウンロードをクリックして認証情報をファイルに保存します。

このファイルの内容より、Oracle APEXのWeb資格証明を作成します。


以上でGoogle側での作業は完了です。


一応、承認済みドメインの設定を確認しておきます。承認済みのJavaScript生成元、承認済みのリダイレクトURIとして設定したURLのトップドメインが設定されているはずです。


Oracle APEX側の作業に移ります。

アプリケーション・ビルダーからワークスペース・ユーティリティを開きます。


ワークスペース・ユーティリティよりWeb資格証明を開きます。


作成済みのWeb資格証明が一覧されます。

作成をクリックします。


名前Google Drive Credentialとします。静的識別子GOOGLE_DRIVE_CREDとしています。(Googleのコンソールでアプリにスコープを追加すると、Google Drive以外のAPIも呼び出せるはずです。そのような計画があるときはWeb資格証明にGoogle Driveという名前はつけない方がよいかもしれません。)

認証タイプOAuth2クライアント資格証明フローです。クライアントIDまたはユーザー名には、ダウンロードしたJSONファイルに含まれるclient_idの値を入力します。クライアント・シークレットまたはパスワードにはclient_secretの値を入力します。

以上で作成をクリックします。


新たにWeb資格証明Google Drive Credentialが作成されました。

スクリーンショットには他にも色々なWeb資格証明があります。これらのWeb資格証明を使ったAPI連携は、すべて本ブログの記事として公開しています。


Google Drive APIを呼び出すAPEXアプリケーションを作成します。

アプリケーション作成ウィザードを起動し、空のアプリケーションを作成します。名前APEX Google Driveとします。

アプリケーションの作成をクリックします。


最初に認証スキームを作成します。

共有コンポーネント認証スキームを開きます。


作成をクリックします。


スキームの作成ギャラリからの事前構成済スキームに基づくを選択します。

へ進みます。


認証スキーム名前Google Accountとします。スキーム・タイプとしてソーシャル・サインインを選択します。

設定資格証明ストアとして、先ほど作成したGoogle Drive Credentialを選択します。認証プロバイダGoogleです。有効範囲(スコープのこと)に以下を指定します。

profile,email,https://www.googleapis.com/auth/drive

ユーザー名としてemailを指定します。メール・アドレスでは一意性を保証できない場合はsubを指定した方が良いかもしれません。ユーザー名の大文字への変換は、APEXのデフォルトに合わせてはいに変更します。

以上で認証スキームの作成をクリックします。


認証スキームGoogle Accountが作成され、カレントの認証スキームになります。


アプリケーションを実行します。

Googleにログインが求められます。Chromeを利用していてGoogleにログイン済みの場合はスキップされるようです。OAuth同意画面の設定で、テストユーザーとして登録してユーザーのメール・アドレスを入力します。


パスワード
を入力します。


2段階認証を設定している場合は、認証を求められます。


初回アクセス時に、このアプリはGoogleで確認されていませんと表示されます。

続行をクリックします。


このアプリがGoogleドライブのすべてのファイルの表示、編集、作成、削除(つまりスコープhttps://www.googleapis.com/auth/driveで可能な作業)を行なうことを許可します。

チェックを入れて、続行します。


アプリケーションのホーム・ページが開きます。


以上でGoogleを使用したソーシャル・サインインの認証を構成できました。

Google Drive APIを呼び出す機能を実装します。MS Graph APIを呼び出すアプリと、ほとんど同じです。

APIを呼び出す機能は、ホーム・ページに実装します。

Bodyにページ・アイテムを作成します。

識別名前P1_GOOGLE_APIタイプテキスト・フィールドラベルGoogle APIとします。このページ・アイテムにGoogle Drive APIのURLを入力します。


Google Drive APIを呼び出すボタンを作成します。

識別ボタン名SUBMITラベルSubmitとします。動作アクションとして動的アクションで定義を選択します。


新規にリージョンを作成します。

識別タイトルGoogle API Responseとします。タイプとして動的コンテンツを選択します。

ソースCLOBを返すPL/SQLファンクション本体として、以下を記述します。

送信するページ・アイテムとしてP1_GOGLE_APIを設定します。


ボタンSUBMITをクリックしたときに、リージョンGoogle API Responseをリフレッシュする動的アクションを作成します。

ボタンSUBMIT上で動的アクションの作成を実行します。

識別タイトルClick Submitとします。タイミングはデフォルトで、イベントクリック選択タイプボタンボタンとしてSUBMITが設定されます。


TRUEアクション識別名前Call Google APIアクションとしてリフレッシュを選択します。影響を受ける要素選択タイプリージョンリージョンはGoogle API Responseを指定します。


以上でGoogle Drive APIを呼び出して応答を確認するページは完成です。

ページを実行し、テストしてみます。

Google Drive APIとして以下を指定し、結果を確認します。

https://www.googleapis.com/drive/v3/files?pageSize=5&fields=nextPageToken,files(kind,mimeType,id)


Google Drive APIがAPEXのアプリケーションにサインインしたユーザーの権限で実行されているが確認できます。また、pageTokenとnextPageTokenを使用したページ送りやfields指定が有効なことも確認できます。

今回の作業は以上になります。

作成したAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/apex-google-drive.zip

Oracle APEXのアプリケーション作成の参考になれば幸いです。