API 게이트웨이 배치 생성

이 기능이 준비되어 있으면 Oracle Identity Cloud Service에서 JWT 검증을 위한 기본 인증 방식을 통합하고 테스트할 수 있습니다.

고유 JWT 검증을 사용하여 API 게이트웨이 배치 생성

Oracle Cloud Infrastructure 게이트웨이 고유 JWT 검증 기능을 사용하면 배포에 대해 JWT(Java 웹 토큰) 기반 인증 정책을 추가할 수 있습니다.

이 JWT 유형을 사용하면 머리글 또는 매개변수를 통해 수신 액세스 토큰의 검증을 수행하는 데 필요한 데이터를 지정할 수 있습니다. 이 정책에는 다음 정보를 제공해야 합니다.

  • 허용된 발행자: 토큰 발행자 여러 OAuth 서버가 발생하지만 이 경우 https://identity.oraclecloud.com/를 사용합니다.
  • 대상자: 이 토큰에 액세스할 수 있는 리소스입니다.
  • 공용 키: 발행자 및 대상자 내에서 토큰을 검증하는 데 사용할 JWKS(Json 웹 키 집합) 입니다. 두 종류의 Jks가 허용됩니다.
    • 정적 키: 이 옵션을 사용하려면 JSON 형식을 사용하여 JWKS를 수동으로 지정해야 합니다. 이 형식은 RFC 7517섹션 4에 따라 필요한 속성이 있어야 합니다.
    • 원격 키: 이 옵션을 사용할 경우 REST를 사용하여 JWKS를 사용할 수 있는 URL을 지정해야 합니다. 현재 이 기능은 Jks를 검색하기 위해 보호된 URL을 읽을 수 없으므로 이 기능의 제한 사항은 지정된 URL의 보호를 해제해야 한다는 것입니다.
  • 고급 옵션:
    • 최대 클럭 불균형(초): API 게이트웨이와 id 제공자의 시간 차이가 있을 경우 이 값을 통해 두 서비스 간의 시간 초과를 조정하도록 토큰 유효성 기간 시간을 조정할 수 있습니다.
    • 클레임: 수신 토큰이 필요한 경우 청구를 확인합니다. 예: client_id 클레임 또는 user_id 클레임.

끝점 및 JWT 검증을 사용하여 이전 단계에서 생성된 기능에 도달할 수 있도록 경로를 지정하여 API 게이트웨이에 새 배치 이름을 생성합니다. 이 예제에서 배치의 이름은 my_jwt_test 입니다.

  1. Oracle Cloud Infrastructure 콘솔의 API 게이트웨이 페이지에서 해당 이름을 눌러 활성 게이트웨이를 선택합니다.
  2. 리소스 에서 배치, 배치 생성 순으로 선택합니다.
  3. 다음 값으로 인증 정책을 구성합니다.
    • 인증 유형: JWT
    • 인증 토큰: 머리글
    • 헤더 이름: 권한 부여
    • 인증 체계: Bearer
    • 익명 액세스 사용: 사용으로 설정됨
  4. Oracle Identity Cloud Service 도메인을 허용된 발행자로 추가하면 토큰 생성기로 사용할 수 있습니다. 발행자 에서 허용된 발행자를 https://identity.oraclecloud.com/으로 설정합니다.
  5. 대상자를 추가합니다. 허용된 대상자를 Oracle Identity Cloud Service Oracle Functions 애플리케이션의 URL로 설정합니다. 예를 들면 https://myinstance.apigateway.mydc.oci.customer-oci.com 입니다.
    검증할 대상자는 생성된 토큰이 액세스할 수 있어야 하는 리소스에 대한 대상자여야 합니다. 이 경우 Oracle Functions Oracle Identity Cloud Service App 리소스 소유자의 클라이언트인 Oracle Identity Cloud Service 앱에서 토큰이 예상됩니다. 이 소유자는 Oracle Functions Oracle Identity Cloud Service App의 기본 대상자에 대한 리소스 범위로 지정됩니다 .
  6. 수신 JWT 토큰 검증에 사용할 JWK를 추가합니다(원격 또는 정적 JWKS). 원격 Jks를 추가하려면 다음과 같이 하십시오.
    1. Oracle Identity Cloud Service 콘솔에 액세스합니다.
    2. 설정, 기본 설정 순으로 선택합니다.
    3. 아직 사용으로 설정되지 않은 경우 액세스 서명 인증서 를 선택하고 저장 을 누른 후 예 를 누릅니다.
    4. Oracle Identity Cloud Service 인스턴스의 JWK URL에 접근합니다. 예: https://idcs-myinstance.identity.dc1.oraclecloud.com/admin/v1/SigningCert/jwk
    5. Jwe URL을 확인할 수 있는지 검증한 후 API 게이트웨이로 돌아가 공용 키를 구성하십시오. 유형원격 Jks로 설정하고 방금 검증한 URL로 URI를 설정합니다.
  7. 정적 Jks를 추가하려면 다음을 수행합니다.
    1. 정적 키 폼을 정의합니다. 이렇게 하려면 Oracle Identity Cloud Service에 대한 JWK를 요청해야 합니다. 곡선을 사용하여 이 작업을 수행할 수 있습니다. 예를 들어, 다음과 같습니다.
      ## Get access token to be able to invoke protected /admin/v1/SigningCert/jwk endpoint.
      # Clientid and ClientSecret should be from an existing IDCS Application in the stripe.
      #
      $ curl -X POST -u "<clientId>:<clientSecret>" https://idcs-myinstance.identity.dc1.oraclecloud.com/oauth2/v1/token -d "grant_type=client_credentials&scope=urn:opc:idm:__myscopes__"
       
       
      export jwtToken="<RETRIEVED_TOKEN>"
       
      ## Get JWK
      $ curl -X GET  https://idcs-myinstance.identity.dc1.oraclecloud.com/admin/v1/SigningCert/jwk -H "Authorization: Bearer ${jwtToken}"
       
      {
          "keys":[{
              "kty":"RSA",
              "x5t#S256":"<value>",
              "e":"<value>",
              "x5t":"<value>",
              "kid":"SIGNING_KEY",
              "x5c":["<value>"],
              "key_ops":["encrypt","verify","wrapKey"],
              "alg":"RS256",
              "n":"<value>"
          }]
      }
    2. API 게이트웨이에서 공용 키를 구성합니다. 유형을 정적 키 로 설정합니다. 키 ID를 SIGNING_KEY로 설정하고 형식을 JSON 웹 키로 설정합니다. Oracle Identity Cloud Service에서 가져온 다음 값 부분 집합만 사용하여 JSON 웹 키에 붙여넣습니다.
      현재 API 게이트웨이에서는 JWK 키의 특정 속성만 지원됩니다. key_ops 등록정보 대신 use 등록정보를 사용합니다.
      {
              "kty":"RSA",
              "e":"<value>",
              "kid":"SIGNING_KEY",
              "use":"sig",
              "alg":"RS256",   
              "n":"<value>"
      }
  8. 선택적으로 [클레임 확인] 섹션에서 검증을 더 추가할 수 있습니다. Oracle Visual Builder 애플리케이션과 연관된 Oracle Identity Cloud Service 애플리케이션에 해당하는 값만 허용하려면 client_id 클레임을 추가합니다. 여러 Oracle Visual Builder 애플리케이션이 있고 OAuth 토큰이 여러 Oracle Visual Builder Oracle Identity Cloud Service Apps를 사용하여 생성되는 경우, 이 확인 단계에 Oracle Identity Cloud Service 클라이언트 ID를 모두 추가해야 합니다. 청구 키를 client_id로 설정하고, 하나 이상의 클레임 값을 입력하고, 필수 확인란을 선택합니다.
  9. 선택적으로 지정된 도메인의 요청을 허용하도록 CORS를 구성할 수 있습니다. 예를 들어, Oracle Visual Builder 서버 호스트 이름을 허용된 요청 출처로 허용해야 할 수 있습니다. 허용된 원본 을 서버 Url로 설정하고, 권한 부여 시 헤더 노출, 권한 부여 허용 , 인증서 허용 을 예로 사용허용된 메소드를 GET, POST로 설정합니다.
  10. 샘플 함수 saasopportunitiesfn와 같이 함수를 가리키도록 경로를 생성합니다. 경로를 /assertion/facall로 설정하고, 메소드를 GET 및 POST로 설정하고, [Oracle Functions] 로 입력하고 , < 사용자 구획 > 의 애플리케이션에 올바른 구획이 선택되어 있는지 확인하고, 애플리케이션을 myapplication과 같은 애플리케이션 이름으로 설정하고, 함수 이름을 saasopportunitiesfn과 같은 함수 이름으로 설정합니다.
변경사항을 저장한 후 API 게이트웨이 배치 my_jwt_test 페이로드의 콘텐츠를 검토할 수 있습니다.

끝점 REST 호출 테스트

새 끝점 REST 호출을 테스트하려면 Postman의 새 액세스 토큰 가져오기 기능을 사용할 수 있습니다.

다음 단계에서 생성된 토큰을 사용하는 경우 토큰이 Oracle Visual BuilderOracle Identity Cloud Service App과 함께 생성되었으며 이전에 설정한 범위별로 현재 구성으로 Oracle Functions에 도달할 수만 있으므로 Oracle Fusion Applications Cloud Service 끝점에 직접 연결할 수 없습니다. 또한 다른 Oracle Identity Cloud Service 앱을 사용하여 토큰을 생성하고 애플리케이션에 Oracle Functions 리소스 범위에 도달할 수 있는 권한이 없는 경우 Oracle Functions Oracle Identity Cloud Service 리소스의 대상자를 추가했기 때문에 API 게이트웨이에서 요청을 허용하지 않습니다(401오류 반환). 청구 클라이언트 ID 확인을 추가한 경우 API 게이트웨이는 지정된 Oracle Identity Cloud Service Apps client_ids와 토큰 일치를 보장합니다.

다음 매개변수를 사용하여 테스트합니다.

  • 권한 부여 유형: 비밀번호 인증서 - 이 권한 부여 유형은 제공된 사용자 이름이 생성된 토큰의 주체가 되도록 하는 데 사용됩니다.
  • 액세스 토큰 URL: Oracle Identity Cloud Service 인스턴스 OAuth URL입니다. 예를 들면 https://idcs-myinstance.identity.dc1.oraclecloud.com/oauth2/v1/token 입니다.
  • 사용자 이름: Oracle Identity Cloud ServiceOracle Fusion Applications Cloud Service에 모두 존재하는 사용자로, 두 사용자 모두 적절한 권한을 가집니다.
  • 비밀번호: 이 사용자의 비밀번호를 입력합니다.
  • ClientId: Oracle Visual Builder와 연관된 Oracle Identity Cloud Service Client Oracle Functions 리소스의 ID입니다.
  • ClientSecret: Oracle Visual Builder와 연관된 Oracle Identity Cloud Service App Client Oracle Functions 리소스의 클라이언트 암호
  • 범위: 이 범위는 Oracle Functions Oracle Identity Cloud Service 앱 제공 리소스와 일치해야 합니다. 예: https://myservice.apigateway.dc1.oci.customer-oci.com/saasextension
  1. Postman 및 위에 나열된 매개변수를 사용하여 검증기 함수를 가리키도록 구성된 경로를 호출합니다.
  2. 또는 곡선을 사용합니다. 예를 들어, 다음과 같습니다.
    curl --location --request GET 'https://myservice.apigateway.dc1.oci.customer-oci.com/saasextension/assertion/facall' \
    --header 'Authorization: Bearer <JWT_TOKEN>'
다음과 유사한 두 가지 도구에서 결과를 가져와야 합니다.
{
  "principal": "mary.jane",
  "gotPrincipalFrom": "BEARER",
  "statusCode": "200",
  "response": {
    "items": [],
    "count": 0,
    "hasMore": false,
    "limit": 25,
    "offset": 0,
    "links": [
      {
        "rel": "self",
        "href": "https://myfusionservice.fa.dc1.oraclecloud.com:443/fscmRestApi/resources/11.13.18.05/expenses",
        "name": "expenses",
        "kind": "collection"
      }
    ]
  }
}

선택적으로 사용자정의 인증으로 API 게이트웨이 배치 생성

사용자 정의 인증 함수를 사용하여 API 게이트웨이 끝점에 대한 인바운드 호출에 대해 Bearer 토큰을 검증하도록 선택할 경우 이 방식을 사용합니다.

이 기능은 Oracle Cloud Infrastructure의 선택적 인증 함수 정의 섹션에서 세 다음에 나온 경우 정의한 선택적 함수입니다.

  1. API 게이트웨이를 배치하려면 API 게이트웨이 페이지에서 해당 이름을 눌러 활성 게이트웨이를 선택합니다.
  2. 리소스 에서 배치 를 누르고 배치 생성 을 누릅니다.
  3. 스크래치 모드에서 마법사를 눌러 API 게이트웨이를 배치할 수 있습니다.
    또는 아래에 설명된 대로 배치 정의 파일을 업로드하도록 선택할 수 있습니다.

다음 코드 조각은 마법사를 사용하는 대신 배치에 사용할 수 있는 Oracle Cloud Infrastructure API 배치 사양 JSON 파일의 예입니다. 이 파일에서 다음을 확인할 수 있습니다.

  • 행 1-8: 인증 요청 정책입니다. 이 배치의 모든 요청에 대해 먼저 이 함수(functionId) 를 호출하고 tokenHeader를 전달하고, true를 반환한 다음, 그렇지 않은 경우 HTTP 인증되지 않은 메시지에 응답함을 알리는 정의입니다.
  • 행 9-17: 상호 원본 리소스 공유를 관리 및 제어하기 위한 CORS 정의입니다.
  • 행 18-43: 두 개의 URL 시작점/verb가 FaaS의 개별 함수에 관련됩니다.
{
    "requestPolicies": {
      "authentication": {
        "type": "CUSTOM_AUTHENTICATION",
        "isAnonymousAccessAllowed": true,
        "functionId": "OCID1.fnfunc.oc1.phx.xxxxxxxxxxxxxxx",
        "tokenHeader": "Authorization"
      }
      "cors":{ 
         "allowedOrigins": [<list-of-origins>], 
         "allowedMethods": [<list-of-methods>], 
         "allowedHeaders": [<list-of-implicit-headers>], 
         "exposedHeaders": [<list-of-exposed-headers>], 
         "isAllowCredentialsEnabled": <true|false>, 
         "maxAgeInSeconds": <seconds> 
      } 
    },
    "routes": [
      {
        "path": "/opportunities",
        "methods": [
          "GET"
        ],
        "requestPolicies": {},
        "backend": {
          "type": "ORACLE_FUNCTIONS_BACKEND",
          "functionId": "OCID1.fnfunc.oc1.phx.xxxxxxxxxxxxxxx"
 
        }
      },
      {
        "path": "/opportunities/{optyid}",
        "methods": [
          "PATCH"
        ],
        "requestPolicies": {},
        "backend": {
          "type": "ORACLE_FUNCTIONS_BACKEND",
          "functionId": "OCID1.fnfunc.oc1.phx.xxxxxxxxxxxxxxx"
        }
      }
    ]
  }
</seconds></true|false></list-of-exposed-headers></list-of-implicit-headers></list-of-methods></list-of-origins>