함수 개발

API 게이트웨이 배치를 배치하기 전에 기능을 개발하고 배치해야 합니다.

업무 논리 정보

구현의 crux는 일부 코드를 함수에 넣는 것입니다. 이 코드는 필요에 따라 복잡하거나 여러 끝점을 호출하거나 일부 집계를 수행할 수 있습니다. 비즈니스 논리 함수는 Oracle Cloud Infrastructure API 게이트웨이에 필요한 경우 호출될 코드입니다.

이 예제 아키텍처에서 API 게이트웨이는 Oracle 함수를 호출하여 REST API를 통해 Oracle Fusion Applications Cloud Service에서 일부 데이터를 쿼리하고 조작한 다음 사용자에게 반환합니다. 기능 자체를 작성하는 경우 적합한 프레임워크를 사용할 수 있지만 서버 없는 기능에 대한 프레임워크의 영향을 알아야 합니다. 이 예에서는 Java를 언어로 사용하고 Apache HttpClient 라이브러리를 사용하여 REST 서비스에 연결합니다. Apache 라이브러리는 사용하기 쉽고 구현하기 쉬우므로 선택되었습니다. 그러나 Java 11에서는 이제 새 HTTP 클라이언트가 사용될 수 있습니다.

또한 REST api를 호출할 때 인메모리 객체를 많이 인스턴스화하는 프레임워크도 방지해야 합니다. 각 호출에서 이러한 객체가 폐기되므로 함수 실행 속도가 느려집니다.

사용자 이름 및 롤 가져오기 정보

Oracle Cloud Infrastructure API 게이트웨이가 함수를 호출할 때 게이트웨이는 HTTP 헤더를 사용하여 일부 메타데이터를 호출에 삽입합니다. 이러한 헤더는 함수 SDK를 사용하여 액세스할 수 있습니다.

예를 들어, Java 코드의 다음 코드 조각(이 솔루션 재생판에 제공된 예제 코드의 JWTUtils 클래스로부터 인용됨) 에서 인증 토큰을 추출하고 디코딩한 다음 본문의 일부로 호출자에게 반환합니다.

public OutputEvent handleRequest(InputEvent rawInput) {
        Optional<string> optionalToken=rawInput.getHeaders().get("Fn-Http-H-Authorization");
        if (!optionalToken.isPresent())
        {
            throw new Exception("No Authentication Bearer token found");
        }
        String jwtToken=optionalToken.get().substring(TOKEN_BEARER_PREFIX.length());
    String[] split_string = jwtToken.split("\\.");
        String base64EncodedHeader = split_string[0];
        String base64EncodedBody = split_string[1];
        String base64EncodedSignature = split_string[2];
        byte[] decodedJWT = Base64.getDecoder().decode(base64EncodedBody);
        try {
            String JSONbody = new String(decodedJWT, "utf-8");
            ObjectMapper mapper = new ObjectMapper();
            JsonNode root=mapper.readTree(JSONbody);
            username=root.get("sub").asText();
            System.out.println(“Username = “+username);
 
        } catch (Exception e)
        {
            Throw new Exception (e.getMessage());
        }
    Return OutputEvent.fromBytes(
            username.getBytes(), // Data
            OutputEvent.Status.Success,// Any numeric HTTP status code can be used here
            "text/plain");

사용자 이름은 함수 내에서 필요에 따라 비즈니스 논리를 구현하는 데 사용할 수 있습니다. 롤은 인증 토큰에서 사용할 수 없지만 REST api를 사용하여 Oracle Identity Cloud Service에서 질의할 수 있습니다.

Oracle API Gateway가 함수를 호출할 때 여러 가지 유용한 헤더도 전송됩니다. 이러한 헤더는 함수의 API를 사용하여 읽을 수 있습니다. 함수 개발자 키트에서 사용할 수 있는 유용한 헤더는 다음과 같습니다.

예를 들어 Fn-Http-Method 및 Fn-Http-Request-Url을 조합하면 코드 내에서 라우터를 구현하여 함수가 호출 방법(예: PUT, PATCH 등) 에 따라 서로 다른 관련 작업을 수행할 수 있습니다. 이 접근 방식은 종종 “서버 없는 서비스” 패턴이라고 하며 개발자가 더 적은 기능을 유지 관리해야 하며 각 기능에는 수행해야 하는 기능을 결정하는 거의 없는 라우터가 있습니다.

public OutputEvent handleRequest(InputEvent rawInput, HTTPGatewayContext hctx) throws JsonProcessingException {
  String httpMethod = hctx.getMethod();
  String httpRequestURI = hctx.getRequestURL();
   // etc
}   

JWT 검증 액세스 토큰을 사용하여 Oracle Fusion Applications Cloud Service 호출 정보

수신 권한 부여 헤더의 주체를 사용하여 Oracle Functions에서 JWT 검증을 구현해야 합니다.

이 솔루션 재생장부와 함께 제공되는 샘플 함수는 이름이 idcsOAuthAsserter 인 helper 라이브러리를 사용하여 이 보안 프로세스를 수행할 수 있습니다. Helper 라이브러리는 Oracle Fusion Applications Cloud Service를 호출하기 전에 bearer 토큰 교환을 수행하여 전체 OAuth 검증 플로우를 수행합니다. 이 라이브러리는 샘플 함수와 통합되어 있습니다.

이 기능을 사용하려면 OAuth JWT 검증을 사용하여 새 전달자 액세스 토큰을 생성하기 위해 Oracle Identity Cloud Service 호출에 사용되는 사용자 및 클라이언트 검증을 생성하기 위해 전용 키와 공용 인증서가 필요합니다.

idcsOAuthAsserter 라이브러리에는 함수 구성에서 정의할 수 있는 일부 속성이 필요합니다. 다음 테이블의 모든 변수는 필수입니다.

구성 이름 설명 예제
IDCS_URL Oracle Identity Cloud Service 인스턴스 URL https://< your identity cloud hostname.identity.oraclecloud.com >
CLIENT_ID Oracle Functions 및 Oracle API Gateway와 연관된 Oracle Identity Cloud Service 애플리케이션 클라이언트 ID 1a2b3c4d5e6f7g8h9i01j2k3l4m5o6p7
KEY_ID 신뢰할 수 있는 Oracle Identity Cloud Service 애플리케이션으로 임포트된 인증서의 별칭입니다. fnassertionkey
범위 이 범위는 Oracle Fusion Applications Cloud Service와 연관된 Oracle Identity Cloud Service Application인 대상 OAuth 리소스와 일치해야 합니다. urn: opc: resource: fa: instanceid = xxxxxxxxxurn: opc: resource: consumer: all https://my_fusion_hostname: 443/
대상 검증 프로세스의 대상자입니다. 값이 여러 개인 경우 콤마로 구분합니다. myhostname.identity.oraclecloud.com, https://myfusionservice.dc1.oraclecloud.com
IDDOMAIN Oracle Fusion Applications Cloud Service 인스턴스 테넌트의 이름입니다. mytenant

또한 이 함수는 idcsOAuthAsserter와 관련된 검증의 암호에 액세스하려면 구성 속성이 필요합니다. 클라이언트 및 사용자 검증을 생성하려면 JWT 검증이 필요한 인증서 및 전용 키가 필요합니다. 이 함수는 V_KEYSTORE에 지정된 OCID를 사용하여 키 저장소를 검색합니다. 해당 정보를 검색하는 별칭은 구성에서 KEY_ID 값과 일치해야 합니다. 키 저장소와 개인 키에 대한 문장암호는 V_KS_PASSV_PK_PASS에 지정된 OCID를 사용하여 Oracle Cloud Infrastructure Vault Secrets 서비스에서 검색해야 합니다.

구성 이름 설명 예제
V_KEYSTORE 키 저장소의 보안 저장된 콘텐츠가 포함된 암호입니다. ocid1.vaultsecret.oc1.dc1.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
V_KS_PASS 키 저장소에 대한 보안 저장된 비밀번호를 포함하는 비밀번호입니다. ocid1.vaultsecret.oc1.dc1.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
V_PK_PASS 전용 키의 보안 저장된 비밀번호를 포함하는 비밀번호입니다. ocid1.vaultsecret.oc1.dc1.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

추가 지원되는 구성 값은 기본적으로 True로 설정된 USE_CACHE_TOKEN 속성입니다. 이 속성을 사용하면 토큰을 계속 사용할 수 있는 한 생성된 Oracle Identity Cloud Service 검증 토큰을 나중에 Oracle Fusion Applications Cloud Service 호출 시 재사용할 수 있도록 저장할 수 있습니다. 캐시된 토큰은 주체를 수신 토큰과 비교하고 만기 시간을 확인하여 계속 적합한지 확인하는 방식으로 사용하기 전에 검증됩니다. 그렇지 않은 경우 OAuth 검증을 사용하여 새 액세스 토큰을 요청합니다. 이 기능은 USE_CACHE_TOKENFalse로 설정하여 비활성화할 수 있습니다.

구현할 함수는 idcsOAuthAsserter 라이브러리에서 SecurityHelper object를 사용하여 access-token 헤더에서 주체를 추출하고, OAuth JWT 검증으로 새 Bearer 액세스 토큰을 생성하고, 새 액세스 토큰을 Authorization 헤더로 사용하여 Oracle Fusion Applications Cloud Service에 요청을 보낼 수 있습니다.

소스 코드 샘플의 함수 saasopportunitiesfn는 이미 idcsOAuthAsserter 라이브러리와 통합되어 있습니다. 다음 코드 조각은 샘플 함수의 handleRequest 측정 단위에서 사용할 수 있습니다. 이 기능은 idcsOAuthAsserter의 객체를 초기화하고 Oracle Identity Cloud Service에서 검증을 사용하여 토큰 교환을 수행하는 방법을 보여 줍니다.

// Full Oauth scenario Perform exchange of tokens
if(fullOAauth) {
    LOGGER.log(Level.INFO, "Full Oauth Assertion scenario - Perform exchange of tokens");
    SecurityHelper idcsSecurityHelper = new SecurityHelper(context)                   // Initialize SecurityHelper with RuntimeContext
                                        .setOciRegion(Region.US_PHOENIX_1)            // Specify the OCI region, used to retrieve Secrets.
                                        .extractSubFromJwtTokenHeader(rawInput);      // Extracts the subject from Token in Fn-Http-H-Authorization.
 
    // Get OAuth Access token with JWT Assertion using the principal extracted from Fn-Http-H-Access-Token Header
    jwttoken = idcsSecurityHelper.getAssertedAccessToken();
    LOGGER.log(Level.INFO, "Successfully token retrived with IDCS Assertion");
    LOGGER.log(Level.FINEST, "Access Token from assertion [" + jwttoken + "]");
}

이 코드 조각에서는 SecurityHelper 객체가 RuntimeContext 유형의 컨텍스트 객체로 초기화됩니다. 이 속성은 SecurityHelperidcsOAuthAsserter Helper 라이브러리에 대한 구성으로 초기화하는 데 사용됩니다.

예제 saasopportunitiesfn 함수가 US_PHOENIX_1 영역을 사용하도록 설정되어 있으므로 코드 조각에 표시된 메소드 setOciRegion의 영역이 영역을 가리키도록 변경해야 합니다.

SecurityHelper 에는 handleRequest 함수 메소드의 InputEvent 객체를 사용하여 API Gateway Authorization 헤더에 제공되는 Bearer 토큰을 추출하는 extractSubFromJwtTokenHeader 메소드도 있습니다. 그런 다음 Oracle Identity Cloud Service 검증의 결과로 액세스 토큰을 검색할 수 있어야 합니다.

idcsOAuthAsserter 사용법 및 함수 통합에 대한 자세한 내용은 이 솔루션 재생과 함께 다운로드 가능한 코드 샘플을 사용하여 코드 저장소의 idcsOAuthAsserter에 대한 README 파일을 검토하십시오.

구성 매개변수 설정

Oracle Functions 환경은 Oracle Cloud Infrastructure 환경 내에서 일부 매개변수를 정의한 다음 코드에서 참조할 수 있는 매우 유용한 기능 조각을 제공합니다.

이 사용 사례에서는 Fusion 및 OverrideJWT 토큰 URL, full_oauth 라는 플래그를 사용자 코드에서 사용되는 매개변수로 설정합니다. 매개변수를 추가하려면 다음과 같이 하십시오.

  1. 명령줄에서 다음을 입력합니다.

    fn config function cloudnativesaas saasopportunitiesfn fusionhost <value>

    fn config function cloudnativesaas saasopportunitiesfn overridejwt <value>

    fn config function cloudnativesaas saasopportunitiesfn full_oauth <value>

  2. 콘솔에서:
    1. 개발자 서비스 를 선택하고 함수 를 선택합니다.
    2. 애플리케이션 에서 원하는 기능을 선택합니다.
    3. [리소스 ] 섹션에서 구성 을 선택합니다.
    4. 다음 항목에 대한 키와 값 쌍을 입력하고 더하기 아이콘을 눌러 매개변수로 추가합니다.
      • fusion URL(key fusionhost)
      • OverrideJWT 토큰 URL(key overridejwt)
      • 전체 OAuth 사용 플래그(키 full_oauth)
  3. 배포 시간 동안 함수 yaml 파일에서:
    config:
      fusionhost: <value>
      overridejwt: <value>
      full_oauth: <value>

코드 내에서 특수 Java 주석(@FnConfiguration) 을 사용하고 컨텍스트 변수를 통해 매개변수에 액세스하여 Functions SDK를 사용하여 이러한 구성 변수에 액세스할 수 있습니다.

private String jwtoverride = "";
    private String fusionHostname = "";
    private String fnURIBase ="/fnsaaspoc/opportunities";
    /**
     * @param ctx : Runtime context passed in by Fn
     */
    @FnConfiguration
    public void config(RuntimeContext ctx) {
        fusionHostname = ctx.getConfigurationByKey("fusionhost").orElse("NOTSET");
        jwtoverride = ctx.getConfigurationByKey("overridejwt").orElse("NOTSET");
        fullOAauth = Boolean.parseBoolean(ctx.getConfigurationByKey("full_oauth").orElse("false"));
        LOGGER.info("Configuration read : jwt=" + jwtoverride + " saasurl=" + fusionHostname);
    }

또한 이 솔루션은 idcsOAuthAsserter helper 라이브러리를 사용하므로 Oracle Identity Cloud Service OAuth 검증을 사용하여 액세스 토큰을 교환하려면 이전 섹션에 설명된 특정 변수를 함수 구성 에서 제공해야 합니다. 이 프로세스는 여러 필수 구성을 필요로 하기 때문에 yaml 파일 접근 방식을 사용하여 함수 구성을 설정하는 것이 좋습니다. 예를 들어, 다음과 같습니다.

config:
  AUDIENCE: <AUDIENCE_VALUES>
  CLIENT_ID: <YOUR_CLIENT_ID>
  IDCS_URL: <YOUR_IDCS_URL>
  IDDOMAIN: <YOUR_FA_TENANT_NAME>
  KEY_ID: <YOUR_IDCS_URL>
  SCOPE: <FA_RESOURCE_SCOPE>
  V_KEYSTORE: <YOUR_KS_OCID>
  V_KS_PASS: <YOUR_KSPASS_OCID>
  V_PK_PASS: <YOUR_PKPASS_OCID>
  fusionhost: <value>
  overridejwt: <value>
  full_oauth: <value>

Fusion Applications에 사용자 인증 토큰 전달

이 기능은 보안 REST API 상호 작용에 대한 사용자 인증 토큰을 처리해야 합니다.

함수를 호출하면 인증 토큰을 포함하는 “권한 부여” 헤더 변수도 전송되었습니다. 이 토큰은 Oracle Cloud Infrastructure API 게이트웨이 함수가 요청을 검증하는 데 사용하는 id 서버와 동일한 id 서버인 호출 애플리케이션의 id 서버를 통해 생성됩니다.

이 솔루션 재생장에 설명된 접근 방식은 Oracle Identity Cloud Service OAuth JWT 검증을 사용하여 idcsOAuthAsserter helper 라이브러리를 사용한 토큰 교환을 수행하는 것이 좋습니다. Oracle Functions에서 Oracle Fusion Applications Cloud Service 로의 호출에 대한 추가 보안 계층을 제공합니다. 구조 다이어그램에 표시된 대로 API 게이트웨이 헤더에서 인바운드 호출에 제공되는 토큰에 대한 OAuth JWT 어설션 질의 기능을 사용하여 Oracle Identity Cloud Service와 검증 프로세스 중 다른 토큰에 대해 교환합니다. 이 새 토큰은 대상 서버(Oracle Fusion Applications Cloud Service) 에 대한 아웃바운드 호출에 사용되며(Oracle Fusion Applications Cloud Service) Oracle Visual Builder에서 사용자로 호출을 실행합니다.

제공된 샘플 함수(saasopportunitiesfn) 에는 기본적으로 True로 설정된 이름이 full_oauth 인 구성이 있으며 위에 설명된 동작이 사용됩니다.

선택적으로 full_oauthFalse로 설정할 수 있습니다. 이 경우 함수는 API 게이트웨이 헤더에서 인바운드 호출에 제공되는 토큰을 질의하고 Oracle Fusion Applications Cloud Service에 대한 아웃바운드 호출에서 다시 사용합니다. 두번째 토큰은 생성되지 않습니다.

다음 코드 조각은 Apache HTTP 라이브러리를 사용하고 전달된 인증 토큰을 사용하여 Oracle Fusion Applications Cloud Service REST API를 호출합니다.

String fusionURL=”<yourfusionresturl>”;
HttpClient client = HttpClients.custom().build();
HttpUriRequest request = RequestBuilder.get().setUri(fusionURL).
     setHeader(HttpHeaders.CONTENT_TYPE, "application/json").
     setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + jwtToken).
     build();
HttpResponse response = client.execute(request);
responseJson = EntityUtils.toString(response.getEntity());
status = response.getStatusLine().getStatusCode();

함수 컴파일 및 배치

Oracle Functions에서 함수에 대한 애플리케이션을 생성한 다음 함수를 배포합니다.

  1. 함수가 로컬 저장소에서 필수 종속성을 생성하기 전에 idcsOAuthAsserter 코드를 컴파일합니다. 예를 들어, 다음과 같습니다.
    $ cd <PATH_TO>/idcsOAuthAsserter
    $ mvn clean install
  2. lib 디렉토리가 yaml.func와 동일한 레벨에 함수에 존재하는지 확인하십시오. 예를 들어, 이 경우 함수 이름은 saasopportunitiesfn 입니다. lib/ 디렉토리에 필요한 파일 idcsOAuthAsserter-1.0.0.jaridcsOAuthAsserter-1.0.0.pom을 생성하려면 Maven 명령을 사용하여 코드를 컴파일합니다.
    $ cd <PATH_TO>/saasopportunitiesfn
    $ mkdir -pv lib/
    $ mvn clean install
     
    $ ls lib/
    idcsOAuthAsserter-1.0.0.jar  idcsOAuthAsserter-1.0.0.pom
  3. Dockerfile을 사용하여 함수에 대한 idcsOAuthAsserter 라이브러리를 통합해야 합니다. 샘플 함수 saasopportunitiesfn의 다음 예에서는 Dockerfile이 이미 있습니다. 프록시 뒤에 있는 경우 ENV MAVEN_OPTS 행의 주석 처리를 해제하여 필요한 프록시 속성으로 Dockerfile 속성을 업데이트해야 할 수 있습니다. 또한 필요한 경우 Dockerfile에서 프록시 속성 MAVEN_OPTS 변수를 수정합니다.
    
    FROM fnproject/fn-java-fdk-build:jdk11-1.0.107 as build-stage
    WORKDIR /function
     
    COPY lib /function/lib
     
    # Uncomment this line and populate if you are behind a proxy
    # ENV MAVEN_OPTS -Dhttp.proxyHost=<ProxyHost> -Dhttp.proxyPort=<ProxyPort> -Dhttps.proxyHost=<ProxyHost> -Dhttps.proxyPort=<ProxyPort>
     
    ADD lib/idcsOAuthAsserter*.pom /function/pom.xml
    RUN ["mvn", "org.apache.maven.plugins:maven-install-plugin:2.5.2:install-file", "-Dfile=/function/lib/idcsOAuthAsserter-1.0.0.jar", "dependency:copy-dependencies", "-DincludeScope=runtime", "-DskipTests=false", "-Dmdep.prependGroupId=true", "-DoutputDirectory=target"]
     
    ADD pom.xml /function/pom.xml
    RUN ["mvn", "package", "dependency:copy-dependencies", "-DincludeScope=runtime", "-DskipTests=false", "-Dmdep.prependGroupId=true", "-DoutputDirectory=target"]
     
    ADD src /function/src
    RUN ["mvn", "package"]
    FROM fnproject/fn-java-fdk:jre11-1.0.107
    WORKDIR /function
    COPY --from=build-stage /function/target/*.jar /function/app/
     
    CMD ["<INSERT_FUNCTION_PACKAGE_AND_CLASSNAME>::handleRequest"]
  4. Oracle Functions의 구획에 애플리케이션을 생성합니다.
    1. 터미널 창에서 다음을 입력하여 새 응용 프로그램을 만듭니다.
      $ fn create app <app-name> --annotation oracle.com/oci/subnetIds='["<subnet-ocid>"]'
      설명:
      • <app-name>은 새 애플리케이션의 이름입니다. 기밀 정보를 입력하지 마십시오.
      • <subnet-ocid>는 함수를 실행할 서브넷의 OCID(또는 서브넷, 최대 3개) 입니다. 지역별 서브넷이 정의된 경우 가용성 도메인 간에 페일오버를 수행하기 위해 해당 서브넷을 선택하는 것이 좋습니다. 지역별 서브넷이 정의되지 않았고 고가용성 요구사항을 충족해야 하는 경우 여러 서브넷을 지정합니다('["<subnet-ocid>","<subnet-ocid>"]' 형식으로 각 OCID를 큰따옴표로 구분하여). Oracle은 서브넷이 Fn Project CLI 컨텍스트에 지정된 Docker 레지스트리와 동일한 영역에 있도록 권장합니다.
    2. 다음을 입력하여 새 애플리케이션이 생성되었는지 확인합니다.
      $ fn list apps
  5. 함수를 애플리케이션에 배포합니다. 예를 들어, 다음과 같습니다.
    $ cd <PATH_TO>/saasopportunitiesfn 
    $ fn deploy --app myapplication --verbose

선택적으로 Oracle Cloud Infrastructure에서 인증 함수 정의

Oracle Cloud Infrastructure API 게이트웨이는 기본적으로 IDCS를 인증 제공자로 지원합니다. 하지만 게이트웨이에서는 함수를 호출할 수 있는 함수의 정의도 허용됩니다. 선택적으로 이 기능을 사용하여 사용자정의 인증 함수를 생성할 수 있습니다.

사용자정의 인증 함수는 게이트웨이로부터 호출을 수신하여 수신 권한 부여 헤더를 전달합니다. 함수가 true를 반환하면 함수 호출이 허용되고, false를 반환하면 요청이 HTTP 401오류 코드로 거부됩니다. 이 기능은 소스 코드 형식으로 제공되며 함수 내에서 배치됩니다. 그런 다음 OCID를 통해 OCI API GATEWAY 배치 파일에서 참조됩니다. 콘솔에서 배치된 함수로 이동하고 OCID 열을 확장하여 OCID를 검색할 수 있습니다. 함수를 배치하려면 먼저 ResourceServerConfig.java 파일을 편집해야 합니다. 이 기능은 함수가 Oracle Identity Cloud Service에 접속하는 방법과 사용되는 Oracle Identity Cloud Service OAuth 애플리케이션을 정의합니다.

아래 함수 예를 사용하면 클라이언트 암호와 같은 중요한 값을 하드 코딩할 수 있습니다. // KMS Key for IDCS Client Secret 설명 아래에 있는 4개 라인에서 코드는 Oracle Cloud Infrastructure 키 관리 기능인 Oracle Cloud Infrastructure Vault를 사용하여 OAuth 암호를 해독합니다. 기능을 배포하기 전에 Oracle Cloud Infrastructure 콘솔에서 이러한 값을 입력합니다.

  1. 사용자정의 인증 함수를 작성합니다. 예를 들어, 다음과 같습니다.
    package com.example.fn.idcs_ocigw.utils;
    import com.fnproject.fn.api.RuntimeContext;
    import java.util.logging.Logger;
    
    /**
     * It contains the resource server configuration and constants
     * Like a properties file, but simpler
     */
    public class ResourceServerConfig {
    
        public  final String CLIENT_ID;
        public  final String CLIENT_SECRET;
        public  final String IDCS_URL ;
        public  final String SCOPE_ID;
    
        //INFORMATION ABOUT IDENTITY CLOUD SERVICES
        public  final String JWK_URL;
        public  final String TOKEN_URL;
        public final String KMS_ENDPOINT;
        public final String KMS_IDCS_SECRET_KEY;
    
        //PROXY
        public  final boolean HAS_PROXY ;
        public  final String PROXY_HOST;
        public  final int PROXY_PORT;
        public  final String DEBUG_LEVEL;
        private static final String NOT_SET_DEFAULT="NOTSET";
    
        /**
         * Gets defaults out of Oracle Functions Configuration
         */
        private  static final Logger LOGGER = Logger.getLogger("IDCS_GTW_LOGGER");
    
        public ResourceServerConfig(RuntimeContext ctx)   {
            // Get config variables from Functions Configuration
            HAS_PROXY = Boolean.parseBoolean(ctx.getConfigurationByKey("idcs_proxy").orElse("false"));
            PROXY_HOST = ctx.getConfigurationByKey("idcs_proxy_host").orElse("");
            PROXY_PORT = Integer.parseInt(ctx.getConfigurationByKey("idcs_proxy_port").orElse("80"));
    
            IDCS_URL = ctx.getConfigurationByKey("idcs_app_url").orElse(NOT_SET_DEFAULT);
            SCOPE_ID = ctx.getConfigurationByKey("idcs_app_scopeid").orElse(NOT_SET_DEFAULT);
            CLIENT_ID = ctx.getConfigurationByKey("idcs_app_clientid").orElse(NOT_SET_DEFAULT);
    
            DEBUG_LEVEL = ctx.getConfigurationByKey("debug_level").orElse("INFO");
            JWK_URL = IDCS_URL+"/admin/v1/SigningCert/jwk";
            TOKEN_URL=IDCS_URL+"/oauth2/v1/token";
    
            // KMS Key for IDCS Client Secret
            KMS_ENDPOINT = ctx.getConfigurationByKey("kms_endpoint").orElse(NOT_SET_DEFAULT);
            KMS_IDCS_SECRET_KEY= ctx.getConfigurationByKey("kms_idcs_secret_key").orElse(NOT_SET_DEFAULT);
    
            String decodedClientSecret="";
    
            // Decode the client Secret using KMS
            decodedClientSecret=DecryptKMS.decodeKMSString(KMS_ENDPOINT,KMS_IDCS_SECRET_KEY,ctx.getConfigurationByKey("idcs_app_secret").orElse(NOT_SET_DEFAULT));
            decodedClientSecret=decodedClientSecret.trim();
    
            CLIENT_SECRET = decodedClientSecret;
    
            LOGGER.info("IDCS Configuration Data read : IDCS_URL=[" + IDCS_URL + "] SCOPE_AUD=[" + SCOPE_ID +"] CLIENT_ID=["+CLIENT_ID+"], DEBUG_LEVEL=["+DEBUG_LEVEL+"]");
        }
    }
    일부 구성 값(예: Oracle Identity Cloud Service 끝점 및 보안) 을 추가해야 합니다. 이러한 구성 매개변수는 Oracle Functions 구성에 입력됩니다.
  2. Oracle Cloud Infrastructure 콘솔에서 Developer Services로 이동하고 함수 를 누릅니다.
  3. 함수를 선택하고 리소스 에서 구성 을 누릅니다.
    함수에 정의된 구성 변수에 대한 값을 입력할 수 있습니다. 중요한 값은 Oracle Cloud Infrastructure Vault에서 보안됩니다.
  4. 함수를 배포합니다. 예를 들어, 다음과 같습니다.
    fn deploy -app fnsaaspoc