Как вызвать службу Oracle REST с использованием аутентификации basi c - PullRequest
0 голосов
/ 10 июля 2020

Как можно вызвать службу данных 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;

1 Ответ

0 голосов
/ 11 июля 2020

Убедитесь, что вы предоставили пользователю соответствующую роль. Используя следующую команду sql, запустите как Sysdba ...

  1. Чтобы узнать, какие права доступа есть у пользователя connect4 SELECT name FROM user_ords_roles Where NAME like 'oracle.dbtools.role.autorest.%';
  2. Чтобы увидеть имена существующих ролей SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTEE = 'CONNECT4';
  3. Наконец, чтобы предоставить требуемую роль: GRANT 'oracle.dbtools.role.autorest.CONNECT4.game' TO CONNECT4;

После вышесказанного попробуйте снова вызвать curl.

Для дальнейшего чтения см .: https://oracle-base.com/articles/misc/oracle-rest-data-services-ords-authentication

...