以前に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を利用している場合は、内部を選ぶことができるようです。
作成をクリックします。
アプリ名は任意です。今回は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ドライブのすべてのファイルの表示、編集、作成、削除なので、非常に強い権限になります。
スコープを選択して、更新します。
保存して次へ進みます。
以上でOAuth同意画面の設定は完了です。
APEXのベースURLにapex_authentication.callbackを繋げます。
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として以下を指定し、結果を確認します。
Google Drive APIがAPEXのアプリケーションにサインインしたユーザーの権限で実行されているが確認できます。また、pageTokenとnextPageTokenを使用したページ送りやfields指定が有効なことも確認できます。
テストユーザーを追加します。
これから作成するAPEXアプリケーションにサインインする開発者を追加します。
保存して次へ進みます。
続いて認証情報を設定します。
画面右より認証情報を開き、認証情報の作成から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
作成をクリックします。
OAuthクライアントを作成しましたとポップアップが開きます。JSONをダウンロードをクリックして認証情報をファイルに保存します。
2段階認証を設定している場合は、認証を求められます。
アプリケーションのホーム・ページが開きます。
このファイルの内容より、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同意画面の設定で、テストユーザーとして登録してユーザーのメール・アドレスを入力します。
初回アクセス時に、このアプリは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ファンクション本体として、以下を記述します。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
declare | |
l_response blob; | |
l_response_pretty clob; | |
begin | |
if :P1_GOOGLE_API is not null then | |
l_response := apex_web_service.make_rest_request_b( | |
p_url => :P1_GOOGLE_API | |
,p_http_method => 'GET' | |
,p_credential_static_id => 'GOOGLE_DRIVE_CRED' | |
); | |
select json_serialize(l_response returning clob pretty) into l_response_pretty from dual; | |
end if; | |
return '<pre><code>' || l_response_pretty || '</code></pre>'; | |
end; |
ボタン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)
今回の作業は以上になります。
作成したAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/apex-google-drive.zip
Oracle APEXのアプリケーション作成の参考になれば幸いです。
完