Как можно вызвать службу данных Oracle REST, отражающую выбор в представлении, используя базовую c аутентификацию?
У меня это работает без аутентификации, но как только я включить аутентификацию и добавить учетные данные к вызову клиента, сервер вернет ошибку 404.
Для сервера я использую базу данных Oracle, размещенную в Oracle облаке.
select * from V$VERSION returns ...
BANNER BANNER_FULL BANNER_LEGACY CON_ID
-------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ----------
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production 0
Version 19.5.0.0.0
Что работает
Учитывая целевую схему с именем connect4
и представление с включенным REST, с именем объекта game
, следующий сценарий PowerShell на клиенте работает и возвращает правильный набор данных, когда authentication required
выключен на сервере ...
$url = 'https://<redacted>.adb.ap-sydney-1.oraclecloudapps.com/ords/connect4/game'
$return = Invoke-RestMethod $url
$return | select -expandProperty Content | convertFrom-Json
Что не работает
Однако, когда я включаю authentication required
, следующее Скрипт powershell должен работать, но не работает. Вместо этого он возвращает 404. $user
в этом списке - пароль учетной записи пользователя connect4. Учетные данные передаются с использованием протокола аутентификации Basi c. Пароль был подтвержден как правильный.
$url = 'https://<redacted>.adb.ap-sydney-1.oraclecloudapps.com/ords/connect4/game'
$user = 'connect4'
$pass = '<redacted>'
$secpasswd = ConvertTo-SecureString $pass -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential( $user, $secpasswd)
$return = Invoke-RestMethod $url -Credential $credential -headers @{'X-ID-TENANT-NAME' = '<redacted>'}
$return | select -expandProperty Content | convertFrom-Json
Предположение
Может быть, пользователю connect4 нужно применить какой-то грант, чтобы он мог выбрать свой собственный объект через REST ? Или у меня клиент звонит неправильно?
Обновление
Фактический объект, отображаемый службами REST, - это представление GAME_VW
. Он имеет псевдоним объекта REST game
, а необходимая авторизация REST - это роль ORDS oracle.dbtools.role.autorest.CONNECT4.GAME_VW
. Я считаю, что ORDS role
- это другое понятие, чем обычная роль Oracle, и поэтому не может быть предоставлено / отозвано обычным способом.
DDL для настроек REST представления -. ..
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
ORDS.ENABLE_OBJECT(p_enabled => TRUE,
p_schema => 'CONNECT4',
p_object => 'GAME_VW',
p_object_type => 'VIEW',
p_object_alias => 'game',
p_auto_rest_auth => TRUE);
commit;
END;
Я считаю, что роль ORDS для этого пользователя настроена правильно. Следующий запрос ...
select NAME as ROLE_NAME, sys_context( 'userenv', 'current_schema' ) as CURRENT_SCHEMA, USER
from USER_ORDS_ROLES
where NAME = 'oracle.dbtools.role.autorest.CONNECT4.GAME_VW';
... возвращает ...
ROLE_NAME CURRENT_SCHEMA USER
-----------------------------------------------------------------------
oracle.dbtools.role.autorest.CONNECT4.GAME_VW CONNECT4 CONNECT4
и этот запрос, используя тот же сеанс ...
select NAME, SCHEMA_ID
from USER_ORDS_ROLES
where NAME like 'oracle.dbtools.role.autorest.CONNECT4%';
... возвращает ...
NAME SCHEMA_ID
--------------------------------------------------------
oracle.dbtools.role.autorest.CONNECT4 10011
oracle.dbtools.role.autorest.CONNECT4.GAME_VW 10011
DDL для этой привилегии ...
DECLARE
l_roles OWA.VC_ARR;
l_modules OWA.VC_ARR;
l_patterns OWA.VC_ARR;
BEGIN
ORDS.ENABLE_SCHEMA(
p_enabled => TRUE,
p_schema => 'CONNECT4',
p_url_mapping_type => 'BASE_PATH',
p_url_mapping_pattern => 'connect4',
p_auto_rest_auth => TRUE);
ORDS.CREATE_ROLE(p_role_name => 'oracle.dbtools.role.autorest.CONNECT4.GAME_VW');
l_roles(1) := 'oracle.dbtools.autorest.any.schema';
l_roles(2) := 'oracle.dbtools.role.autorest.CONNECT4.GAME_VW';
l_patterns(1):= '/game/*';
l_patterns(2):= '/metadata-catalog/game/*';
ORDS.DEFINE_PRIVILEGE(
p_privilege_name => 'oracle.dbtools.autorest.privilege.CONNECT4.GAME_VW',
p_roles => l_roles,
p_patterns => l_patterns,
p_modules => l_modules,
p_label => '',
p_description => '',
p_comments => NULL);
COMMIT;
END;