附註:

使用 OCI IAM 網域所發出的 JWT 權杖存取 ORDS 中受保護的資源

簡介

Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) 使用識別網域來提供識別和存取管理功能,例如 OCI 的認證、單一登入 (SSO) 和識別生命週期管理,以及 Oracle 和非 Oracle 應用程式 (無論是 SaaS、雲端代管還是內部部署)。

Oracle REST Data Services (ORDS) 可橋接 HTTPS 和您的 Oracle Database。ORDS 是一個中間層 Java 應用程式,提供 Database Management REST API、SQL Developer Web、PL/SQL 閘道、Simple Oracle Document Access (SODA) for REST,以及能夠發佈 RESTful Web 服務以與 Oracle Database 中的資料和預存程序互動。

ORDS 版本 23.3 導入 JSON Web 權杖 (JWT) 支援。這些 Bearer 權杖可讓 ORDS 開發人員將認證和授權委派給任何符合 OAuth2 規範的身分識別提供者 (IdP) 以發出 JWT 存取權杖,讓 ORDS 可以驗證以提供 ORDS 保護資源的存取權。

在本教學課程中,我們將示範如何使用 OCI IAM 網域所發出的 JWT 權杖存取 ORDS 中受保護的資源。在本示範中,我們將使用 OCI 中的 Oracle Autonomous Database,隨附預先設定且完全受管理的 ORDS 應用程式。

下圖顯示解決方案架構的高階表示法。

架構圖

目標

必要條件

注意:由其發出的 OCI IAM 網域和 JWT 權杖符合上述所有需求。

作業 1:設定資料庫綱要的 ORDS、定義 API 端點以及設定存取控制

  1. 登入 OCI 主控台,瀏覽至 Oracle Database 並按一下 Autonomous Database

  2. 按一下佈建的 Autonomous Database 執行處理資料庫動作,然後按一下 SQL

  3. 請執行下列查詢,確定您有支援 JWT 的 ORDS 版本 23.3 或更新版本。

    SELECT * FROM ORDS_METADATA.ORDS_VERSION;
    

    ORDS 版本

  4. 執行下列查詢以建立使用者 (ordstest),並指派必要的權限。

    CREATE USER ordstest IDENTIFIED BY "<Password>";
    GRANT CONNECT, RESOURCE TO ordstest;
    ALTER USER ordstest DEFAULT ROLE CONNECT, RESOURCE;
    
  5. 執行下列查詢,為綱要啟用 ORDS 以允許使用 REST API 功能。

    BEGIN
     ORDS_ADMIN.ENABLE_SCHEMA(
         p_enabled => TRUE,
         p_schema => 'ordstest',
         p_url_mapping_type => 'BASE_PATH',
         p_url_mapping_pattern => 'ordstest',
         p_auto_rest_auth=> FALSE
     );
    commit;
    END;
    /
    
  6. 執行下列查詢,在 ordstest 綱要中建立名為 emp 的表格,並插入範例資料。

    CREATE TABLE ordstest.emp (
    EMPNO NUMBER(4,0),
    ENAME VARCHAR2(10 BYTE),
    JOB VARCHAR2(9 BYTE),
    MGR NUMBER(4,0),
    HIREDATE DATE,
    SAL NUMBER(7,2),
    COMM NUMBER(7,2),
    DEPTNO NUMBER(2,0),
    CONSTRAINT PK_EMP PRIMARY KEY (EMPNO)
    );
    
    Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7369,'SMITH','CLERK',7902,to_date('17-DEC-80','DD-MON-RR'),800,null,20);
    Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7499,'ALLEN','SALESMAN',7698,to_date('20-FEB-81','DD-MON-RR'),1600,300,30);
    Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7521,'WARD','SALESMAN',7698,to_date('22-FEB-81','DD-MON-RR'),1250,500,30);
    Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7566,'JONES','MANAGER',7839,to_date('02-APR-81','DD-MON-RR'),2975,null,20);
    Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7654,'MARTIN','SALESMAN',7698,to_date('28-SEP-81','DD-MON-RR'),1250,1400,30);
    
  7. 執行下列查詢以定義將包含 API 端點的 ORDS 模組 (demo)。

    BEGIN
      ORDS_ADMIN.DEFINE_MODULE(
         p_schema => 'ordstest',
         p_module_name => 'demo',
         p_base_path => '/demo/',
         p_items_per_page=> 1000,
         p_status => 'PUBLISHED',
         p_comments=> ''
     );
    COMMIT;
    END;
    /
    
  8. 執行下列查詢以定義對應至特定 REST 資源的範本 emp

    BEGIN
     ORDS_ADMIN.DEFINE_TEMPLATE(
         p_schema => 'ordstest',
         p_module_name => 'demo',
         p_pattern => 'emp',
         p_priority => 0,
         p_etag_type => 'HASH',
         p_comments => ''
     );
    COMMIT;
    END;
    /
    
  9. 執行下列查詢以建立 emp 的 GET 要求處理程式,該處理程式會執行從表格 emp 傳回資料的簡單 SQL 查詢。

    BEGIN
     ORDS_ADMIN.DEFINE_HANDLER(
         p_schema => 'ordstest',
         p_module_name => 'demo',
         p_pattern => 'emp',
         p_method => 'GET',
         p_source_type => ords.source_type_collection_feed,
         p_source => 'select * from emp',
         p_items_per_page => 25,
         p_comments => ''
     );
    COMMIT;
    END;
    /
    

    /ordstest/demo/emp 附加至 Oracle 自治式資料庫的 ORDS 公用存取 URL (位於工具組態底下),即可檢視 emp 表格而不進行任何認證。本自學課程使用 Postman 。

    ORDS URL

    存取 (不含認證)

  10. 執行下列查詢以定義保護 demo 模組的權限 (privilegetest)。

    DECLARE
    L_PRIV_ROLES owa.vc_arr;
    L_PRIV_PATTERNS owa.vc_arr;
    L_PRIV_MODULES owa.vc_arr;
    BEGIN
    L_PRIV_MODULES( 1 ) := 'demo';
    ORDS_ADMIN.DEFINE_PRIVILEGE(
      P_Schema=> 'ordstest',
      P_PRIVILEGE_NAME => 'privilegetest',
      P_ROLES => L_PRIV_ROLES,
      P_PATTERNS =>  L_PRIV_PATTERNS,
      P_MODULES => L_PRIV_MODULES,
      P_LABEL => 'privilegetest',
      P_DESCRIPTION => 'Demonstrate controlling access with priviliges',
      P_COMMENTS=> ''
      );
    COMMIT;
    END;
    /
    

    由於 demo 模組受到 privilegetest 權限的保護,因此未經適當授權便無法存取。若要啟用存取,您必須為 ordstest 綱要建立 JWT 設定檔。這可讓 ORDS 驗證 JWT Bearer 權杖並授予受保護資源 (例如示範模組) 的存取權。

作業 2:建立 ORDS JWT 設定檔

您可以使用 OAUTH.CREATE_JWT_PROFILE 程序,在啟用 REST 的綱要內建立 JWT 設定檔。不過,每個綱要只能定義一個 JWT 設定檔。若要更新現有的 JWT 設定檔,必須先將其刪除,再建立新的 JWT 設定檔。

BEGIN
  OAUTH_ADMIN.DELETE_JWT_PROFILE(p_schema=>'ordstest');
  OAUTH_ADMIN.CREATE_JWT_PROFILE(
  p_schema => 'ordstest',
  p_issuer => 'https://idcs-123456789abcdefghijklmnopqrstuvw.identity.oraclecloud.com',
  p_audience => 'ords/ordstest/',
  p_jwk_url =>'https://idcs-123456789abcdefghijklmnopqrstuvw.identity.oraclecloud.com:443/admin/v1/SigningCert/jwk'
 );
COMMIT;
END;
/

此 JWT 設定檔指定發照者、受眾及 JWK URL。

若要取得 OCI IAM 網域的 IssuerJWK URI,請傳送 GET 要求至 OCI IAM 網域 URL (附加 /.well-known/openid-configuration),如下圖所示。

IAM 網域描述資料

若要驗證 JWT 設定檔組態,請以 ordstest 使用者身分登入並執行下列 SQL 查詢。

SELECT * FROM ORDS_METADATA.USER_ORDS_JWT_PROFILE;

此查詢會擷取 JWT 設定檔詳細資訊,確保已正確設定發照者、受眾及 JWK URL。

ORDS JWT 設定檔

設定 JWT 設定檔之後,一般使用者可以提供 OAuth 2.0 相容 IdP 所發出的 JWT 權杖 (例如 JWT 設定檔中指定的 OCI IAM 網域),以存取 ORDS 受保護的資源。順利驗證 JWT Bearer 權杖時,ORDS 會接受下列項目:

作業 3:啟用無認證之 OCI IAM 網域簽署憑證的 ORDS 存取

  1. 移至 OCI 主控台,瀏覽至識別與安全識別,然後按一下網域

  2. 按一下您要處理之識別網域的名稱。您可能必須變更區間才能找到您要的網域。按一下設定值網域設定值

  3. 存取簽署憑證區段中,選取設定從屬端存取,然後按一下儲存變更。這可讓 ORDS 存取識別網域的簽署認證,不需要認證。

    簽章憑證

作業 4:設定資源伺服器和從屬端、JWT 範圍以及 ORDS 權限

您必須設定 IdP,才能發出符合必要 ORDS 權限之範圍的 JWT。如果 ORDS 中的資源受到權限保護,則必須將該權限名稱定義為範圍。此範圍允許應用程式代表使用者要求存取權。發出的 JWT 必須接著包含範圍作為求償。由於我們將使用 OCI IAM OAuth2 服務強制執行授權,因此需要設定部分資源伺服器和從屬端。

作業 4.1:建立具有所需對象與範圍的資源伺服器類型機密應用程式

  1. 移至您使用的識別網域,然後按一下整合的應用程式

  2. 依序選取新增應用程式機密應用程式,然後按一下啟動工作流程

  3. 輸入應用程式的名稱 (例如,ORDS-SERVER),然後按一下下一步

  4. 資源伺服器組態段落中,選取立即將此應用程式設定為資源伺服器

  5. 使用符合 JWT 設定檔的主要對象符合 ORDS 權限的範圍來設定資源伺服器。

    資源伺服器組態

  6. 下一步完成

  7. 在應用程式總覽頁面中,選取啟用並確認要啟用應用程式。機密應用程式已啟用。

作業 4.2:建立指定所需範圍的從屬端類型機密應用程式

  1. 移至您使用的識別網域,然後按一下整合的應用程式

  2. 依序選取新增應用程式機密應用程式,然後按一下啟動工作流程

  3. 輸入應用程式的名稱 (例如,ORDS-CLIENT),然後按一下下一步

  4. 用戶端組態區段中,選取立即將此應用程式設定為用戶端

  5. 授權區段中,選取用戶端憑證

    注意:在此教學課程中,我們將使用從屬端證明資料作為授權類型。您可以根據您的需求選取不同的授權類型,例如使用者導向從屬端的授權代碼流程

  6. 用戶端類型中,選取機密

  7. 權杖發放原則區段中,選取特定作為授權的資源

  8. 按一下新增資源,然後在資源下,選取新增範圍。為在 Task 4.1 中建立的資源伺服器選取所需的範圍。例如,privilegetest

    從屬端組態

  9. 下一步完成

  10. 應用程式概觀頁面中,選取啟用並確認您要啟用應用程式。機密應用程式已啟用。

  11. 複製此從屬端應用程式的從屬端 ID從屬端密碼。驗證需要這些憑證。

作業 5:使用 JWT Bearer 權杖將要求傳送至 ORDS

將張貼要求 (使用 Postman) 傳送至授權類型client_credentials範圍privilegetest 的 OCI IAM 網域權杖端點,如下列影像所示。

權杖端點

注意:從 OCI IAM 網域要求 Bearer 權杖時,範圍欄位中必須包含受眾和範圍。

從屬端證明資料

驗證範圍、發照者及對象的 JWT 權杖。

JWT 權杖詳細資訊

現在,您可以透過提供具有取得要求的有效 JWT Bearer 權杖 (如下圖所示),來存取 ordstest 綱要中受保護的 ORDS 資源 (示範模組)。

使用 JWT 存取

ORDS 會從 JWK URL 擷取公開金鑰並驗證權杖的簽章來驗證權杖。如果簽章有效,ORDS 會檢查 iss (發行者) 和 aud (受眾) 宣告是否符合 JWT 設定檔中定義的宣告。它也會驗證範圍宣告是否對應保護資源的權限。如果符合所有條件,就會將受保護資源的存取權授與使用者。

認可

其他學習資源

探索 docs.oracle.com/learn 上的其他實驗室,或存取 Oracle Learning YouTube 頻道上的更多免費學習內容。此外,請造訪 education.oracle.com/learning-explorer 以成為 Oracle Learning Explorer。

如需產品文件,請造訪 Oracle Help Center