本記事は、以下の後編の位置付けです。
LiveLabsでやってることの概要
- AutoRESTでテーブルをAPIで公開するステップ(前編)
- ビジネスロジックをAPIで公開するステップ(後編:この記事)
実施メモ
RESTの手動設定(SQL文の実行)
以下のSQL文を追加
CREATE OR REPLACE PROCEDURE RETURN_COUNT (
P_INPUT IN VARCHAR2,
P_OUTPUT OUT NUMBER
) IS
BEGIN
SELECT
COUNT(*)
INTO P_OUTPUT
FROM
CSV_DATA
WHERE
COL2 = P_INPUT;
END RETURN_COUNT;
/
以下SQLを実行
DECLARE
L_OUTPUT NUMBER;
BEGIN
RETURN_COUNT(P_INPUT => 'a1', P_OUTPUT => L_OUTPUT);
DBMS_OUTPUT.PUT_LINE(L_OUTPUT);
END;
/
SQL文をRESTで公開
モジュール作成
Database Actions/RESTを選択
以下を入力・選択の上、作成を選択
モジュール名: com.oracle.livelab.livelab-api
ベース・パス: livelab-api
権限によって保護済: 被保護
(参考)実際に実行されるコード
-- DEFINE MODULE
BEGIN
ORDS.DEFINE_MODULE(
p_module_name => 'com.oracle.livelab.livelab-api',
p_base_path => '/livelab-api/',
p_items_per_page=> 25,
p_status => 'PUBLISHED',
p_comments=> ''
);
COMMIT;
END;
/
テンプレート作成
URIテンプレートに以下を入力の上、右下の作成を選択
sqlreport/:id
(参考)実際に実行されるコード
-- DEFINE TEMPLATE
BEGIN
ORDS.DEFINE_TEMPLATE(
p_module_name => 'com.oracle.livelab.livelab-api',
p_pattern => 'sqlreport/:id',
p_priority => 0,
p_etag_type => 'HASH',
p_comments => ''
);
COMMIT;
END;
/
SQL Handler作成
ソースに以下を入力の上、右下の作成を選択
select * from csv_data where col2 = :id
(参考)実際に実行されるコード
-- DEFINE HANDLER
BEGIN
ORDS.DEFINE_HANDLER(
p_module_name => 'com.oracle.livelab.livelab-api',
p_pattern => 'sqlreport/:id',
p_method => 'GET',
p_source_type => ords.source_type_collection_feed,
p_source => 'select * from csv_data where col2 = :id',
p_items_per_page => 25,
p_comments => ''
);
COMMIT;
END;
/
REST APIを実行
ブラウザから実行(URLに以下を入力)
https://sya6vphk3pzlkhq-dw4ai.adb.ap-tokyo-1.oraclecloudapps.com/ords/admin/livelab-api/sqlreport/a1
ビジネスロジック(PL/SQL Procedure)をRESTで公開
テンプレートの作成を選択
com.oracle.livelab.livelab-api
URIテンプレートに以下を入力の上、右下の作成を選択
ハンドラの作成を選択
以下を入力の上、右下の作成を選択
メソッド: POST
ソース:
BEGIN
return_count(p_input => :id, p_output => :output);
end;
(参考)実際に実行されるコード
-- DEFINE HANDLER
BEGIN
ORDS.DEFINE_HANDLER(
p_module_name => 'com.oracle.livelab.livelab-api',
p_pattern => 'bizlogic',
p_method => 'POST',
p_source_type => ords.source_type_plsql,
p_source => 'BEGIN
return_count(p_input => :id, p_output => :output);
end;',
p_items_per_page => 25,
p_comments => ''
);
COMMIT;
END;
パラメータの作成
画面真ん中のParametersを選択の上、右下のパラメータの作成を選択
以下を入力の上、右下の作成を選択
パラメータ名: output
バインド変数名: output
ソースタイプ: レスポンス
パラメータ・タイプ: INT
アクセスメソッド: 出力
(参考)実際に実行されるコード
-- DEFINE PARAMETER
BEGIN
ORDS.DEFINE_PARAMETER(
p_module_name => 'com.oracle.livelab.livelab-api',
p_pattern => 'bizlogic',
p_method => 'POST',
p_name => 'output',
p_bind_variable_name => 'output',
p_source_type => 'RESPONSE',
p_access_method => 'OUT',
p_comments => '',
p_param_type => 'INT'
);
COMMIT;
END;
ORDS APIを用いたテストの実施
+ボタンを選択してバインド変数を以下のとおり入力する
バインド変数を以下のとおり入力する
id: a1
output: Null
コンソールなどからコピーしたコマンドを実行する
curl --location --request POST \
'https://sya6vphk3pzlkhq-dw4ai.adb.ap-tokyo-1.oraclecloudapps.com/ords/admin/livelab-api/bizlogic' \
--header 'Content-Type: application/json' \
--data-binary '{
"id": "a1",
"output": ""
}'
以下アウトプットとなっているか確認する
{"output":8204}%
OpenAI Viewの確認
POST /bizlogicの右側のボタンを選択する
(参考)PostmanでOpenAPIファイルをインポートする
REST endpoinsのセキュア化
ここでは、以下を実施する
- OAuth2 Tokenの作成
- Secure REST Endpoints
- セキュアなエンドツーエンドの流れをテスト
REST Endpointへのセキュアロールの作成
ロール名に「oracle.livelabs.role.admin」を入力のうえ、「作成」を選択
(参考)実際に実行されるコード
BEGIN
ORDS.CREATE_ROLE(
P_ROLE_NAME => 'oracle.livelabs.role.admin'
);
COMMIT;
END;
権限の作成
セキュリティ -> 権限を選択
「権限の作成」を選択
以下内容を入力
- ラベル: Livelabs REST Privilege
- 名前: oracle.livelabs.privilege.admin
- 説明: Livelabs Privilege for Business Logic REST Services
ロールを選択
「oracle.livelabs.privilege.admin」を選択
「com.oracle.livelab.livelab-api」を選択
(参考)実際に実行されるコード
DECLARE
L_PRIV_ROLES owa.vc_arr;
L_PRIV_PATTERNS owa.vc_arr;
L_PRIV_MODULES owa.vc_arr;
BEGIN
L_PRIV_ROLES( 1 ) := 'oracle.livelabs.role.admin';
L_PRIV_MODULES( 1 ) := 'com.oracle.livelab.livelab-api';
ORDS.DEFINE_PRIVILEGE(
P_PRIVILEGE_NAME => 'oracle.livelabs.privilege.admin',
P_ROLES => L_PRIV_ROLES,
P_PATTERNS => L_PRIV_PATTERNS,
P_MODULES => L_PRIV_MODULES,
P_LABEL => 'Livelabs REST Privilege',
P_DESCRIPTION => 'Livelabs Privilege for Business Logic REST Services',
P_COMMENTS=> ''
);
COMMIT;
END;
OAuthクライアントの作成
以下内容を入力
- 付与タイプ: CLIENT_CRED
- 名前: oauthclient
- 説明: Security on my REST Service
- サポート電子メール: support@support.com
- サポートURI: https://www.oracle.com/rest/
↑ サポートURIは、authrorization errorが起きたときにリダイレクトされるURI
「oracle.livelabs.privilege.admin」を選択
「oracle.livelabs.privilege.admin」を選択のうえ、右下の「作成」を選択
(参考)実際に実行されるコード
BEGIN
L_CLIENT_CREDS := ORDS_METADATA.ORDS_SECURITY.REGISTER_CLIENT(
P_NAME => 'oauthclient',
P_GRANT_TYPE => 'client_credentials',
P_SUPPORT_EMAIL => 'support@support.com',
P_DESCRIPTION => 'Security on my REST Service',
P_CLIENT_SECRET => ORDS_CONSTANTS.OAUTH_CLIENT_SECRET_DEFAULT ,
P_PRIVILEGE_NAMES => 'oracle.livelabs.privilege.admin',
P_ORIGINS_ALLOWED => '',
P_REDIRECT_URI => '',
P_SUPPORT_URI => 'https://www.oracle.com/rest/'
);
ORDS_METADATA.ORDS_SECURITY.GRANT_CLIENT_ROLE(
P_CLIENT_NAME => 'oauthclient',
P_ROLE_NAME => 'oracle.livelabs.role.admin'
);
COMMIT;
END;
クライアント・シークレットが表示される
後で利用するため、このシークレットをメモしておく
モジュール -> 「編集」を選択
「権限によって保護済」のところに、自動的に「oracle.livelabs.privilege.admin」が入力されていることを確認
Bearerトークンの取得
「最近使用したオブジェクト」からAuth Client - oauthclient(CLIENT_CRED) -> 「Bearerトークンの取得」を選択
上記でコピーしたコマンドに、先ほどコピーしたSecretを埋め込み実行
テスト
まずは、Tokenを設定せずにcurlアクセス
% curl --location --request POST \
'https://sya6vphk3pzlkhq-dw4ai.adb.ap-tokyo-1.oraclecloudapps.com/ords/admin/livelab-api/bizlogic' \
--header 'Content-Type: application/json' \
--data-binary '{
"id": "a1",
"output": "<VALUE>"
}'
{
"code": "Unauthorized",
"message": "Unauthorized",
"type": "tag:oracle.com,2020:error/Unauthorized",
"instance": "tag:oracle.com,2020:ecid/2cd118bda79e07cb3df7447164796f94"
}%
次に先程取得したトークンを埋め込んでcurlアクセス
埋め込むトークンは以下の形式
--oauth2-bearer "[TOKEN]"
上記のとおり、トークンをREST APIに埋め込むことで、想定どおりのアウトプットが帰ってくるようになる。