Sviluppare funzioni

Prima di distribuire una distribuzione di gateway API, è necessario sviluppare e distribuire le funzioni.

Informazioni sulla business logic

L'ambiente crux dell'implementazione consiste nell'inserire un codice in una funzione. Questo codice potrebbe essere complesso, se necessario, richiamando più endpoint o eseguendo alcune aggregazioni. La funzione di business logic è il codice che verrà richiamato quando richiesto dal gateway API Oracle Cloud Infrastructure.

In questa architettura, il gateway API chiama una funzione Oracle, che attiva l'esecuzione di query su alcuni dati da Oracle Fusion Applications Cloud Service tramite l'API REST, la manipolazione e la restituisce all'utente. Quando si scrive la funzione, è possibile utilizzare qualsiasi framework adatto, ma è necessario conoscere l'impatto di una struttura per le funzioni serverless. In questo esempio sono state utilizzate Java come lingua e libreria Apache HttpClient per la connessione al servizio REST. La libreria Apache è stata scelta poiché è stata facile utilizzare e da implementare; tuttavia, in Java 11 ora è disponibile il nuovo client HTTP che può essere utilizzato.

È inoltre necessario evitare i framework che creano un'istanza di numerosi oggetti in memoria quando si richiamano le API REST, in quanto questi oggetti verranno eliminati in ogni chiamata e pertanto l'esecuzione della funzione viene lenta.

Informazioni sul recupero dei nomi utente e dei ruoli

Quando una funzione viene chiamata dal gateway API Oracle Cloud Infrastructure, il gateway inserisce alcuni metadati nella chiamata utilizzando le intestazioni HTTP. Queste intestazioni sono accessibili mediante Functions SDK.

Ad esempio, nello snippet di codice Java riportato di seguito (estratto dalla classe JWTUtils nel codice di esempio fornito con questo playbook della soluzione), estrarre il token di autenticazione, convertirlo, quindi restituirlo come parte del corpo del chiamante.

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");

Il nome utente può essere utilizzato nella funzione per implementare la business logic in base alle esigenze. I ruoli non sono disponibili nel token di autenticazione, ma possono essere sottoposti a query da Oracle Identity Cloud Service utilizzando le API REST.

Quando Oracle API Gateway chiama la funzione, viene inviato anche un numero di intestazioni utili. Queste intestazioni possono essere lette utilizzando l'API della funzione. Le intestazioni utili disponibili in Functions Developer Kit includono:

Ad esempio, utilizzando una combinazione di Fn-Http-Method e Fn-Http-Request-Url, è possibile implementare un router all'interno del codice in modo che la funzione esegua diverse operazioni correlate in base alle modalità di chiamata (ad esempio, PUT, PATCH e così via). Questo approccio viene spesso chiamato pattern “Servizio senza server” e offre il vantaggio che lo sviluppatore deve gestire un numero inferiore di funzioni e ciascuna funzione dispone di un piccolo router che determina la necessità di eseguire.

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

Informazioni sulla chiamata di Oracle Fusion Applications Cloud Service mediante un token di accesso all'asserzione JWT

È necessario implementare l'asserzione JWT da Oracle Functions utilizzando l'oggetto nell'intestazione Autorizzazione in entrata.

La funzione di esempio fornita con questo playbook di soluzione può eseguire il processo di sicurezza utilizzando una libreria di supporto denominata idcsOAuthAsserter. La libreria di supporto esegue il flusso completo delle asserzioni OAuth mediante lo scambio di token bearer prima di richiamare Oracle Fusion Applications Cloud Service. Questa libreria è integrata con la funzione di esempio.

La funzione richiede la chiave privata e il certificato pubblico per creare le asserzioni utente e client utilizzate per richiamare Oracle Identity Cloud Service e creare un nuovo token di accesso bearer utilizzando l'asserzione JWT OAuth.

La libreria idcsOAuthAsserter richiede alcune proprietà che è possibile definire nella configurazione delle funzioni. Tutte le variabili nella tabella seguente sono obbligatorie:

Nome configurazione Descrizione Esempio
IDCS_URL URL dell'istanza di Oracle Identity Cloud Service https://<il nome host del cloud di identità: identity.oraclecloud.com>
CLIENT_ID L'ID client dell'applicazione Oracle Identity Cloud Service associato a Oracle Functions e Oracle API Gateway 1a2b3c4d5e6f7g8h9i01j2k3l4m5o6p7
KEY_ID Alias dei certificati importati nell'applicazione Trusted Oracle Identity Cloud Service fnassertionkey
AMBITO Questo ambito deve corrispondere alla risorsa OAuth di destinazione, ovvero l'applicazione Oracle Identity Cloud Service associata a Oracle Fusion Applications Cloud Service. urn:opc:resource:fa:instanceid=xxxxxxurn:opc:resource:consumer:: all https://my_fusion_hostname:443/
DESTINATARI Audience per il processo di asserzione. Utilizzare le virgole per separare più valori. myhostname.identity.oraclecloud.com, https://myfusionservice.dc1.oraclecloud.com
IDDOMAIN Nome del tenant dell'istanza Oracle Fusion Applications Cloud Service mytenant

La funzione richiede inoltre le proprietà di configurazione per accedere ai segreti per un'asserzione correlata a idcsOAuthAsserter. L'asserzione JWT richiede un certificato e una chiave privata per generare le asserzioni client e utente. La funzione recupera il keystore con l'OCID specificato in V_KEYSTORE. L'alias per il recupero di tali informazioni deve corrispondere al valore KEY_ID nella configurazione. La passphrase sia per il keystore che per la chiave privata deve essere recuperata da Oracle Cloud Infrastructure Vault Secrets Service utilizzando gli OCIDs specificati in V_KS_PASS e V_PK_PASS.

Nome configurazione Descrizione Esempio
V_KEYSTORE Segreto che contiene il contenuto sicuro memorizzato del keystore ocid1.vaultsecret.oc1.dc1. xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
V_KS_PASS Segreto che contiene la password sicura memorizzata per il keystore ocid1.vaultsecret.oc1.dc1. xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
V_PK_PASS Segreto che contiene la password sicura memorizzata per la chiave privata ocid1.vaultsecret.oc1.dc1. xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Un valore di configurazione supportato aggiuntivo è la proprietà USE_CACHE_TOKEN, impostata su True per impostazione predefinita. Questa proprietà consente di memorizzare il token di asserzione Oracle Identity Cloud Service generato per essere riutilizzato in richiami futuri di Oracle Fusion Applications Cloud Service, a condizione che il token rimanga valido. Il token inserito nella cache viene convalidato prima dell'uso confrontando l'oggetto con il token in entrata e verificando l'ora di scadenza per verificare se è ancora valido. In caso contrario, viene richiesto un nuovo token di accesso utilizzando l'asserzione OAuth. Questa funzione può essere disabilitata impostando USE_CACHE_TOKEN su False.

La funzione da implementare può utilizzare SecurityHelper object dalla libreria idcsOAuthAsserter per estrarre l'oggetto dall'intestazione access-token, generare un nuovo token di accesso Bearer con l'asserzione JWT OAuth e inviare una richiesta a Oracle Fusion Applications Cloud Service utilizzando il nuovo token di accesso come intestazione Authorization.

La funzione saasopportunitiesfn nell'esempio di codice sorgente è già integrata con la libreria idcsOAuthAsserter. Il seguente snippet di codice è disponibile nel parametro handleRequest metdhod della funzione di esempio, che mostra come inizializzare gli oggetti di idcsOAuthAsserter ed eseguire un'eccezione di modifica dei token utilizzando l'asserzione con 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 + "]");
}

Notare in questo snippet che l'oggetto SecurityHelper è inizializzato con un oggetto di contesto di tipo RuntimeContext. Verrà utilizzato per inizializzare SecurityHelper con la configurazione della libreria di supporto idcsOAuthAsserter.

La funzione saasopportunitiesfn di esempio è impostata in modo da utilizzare l'area US_PHOENIX_1, pertanto è necessario modificare l'area nel metodo setOciRegion mostrato nello snippet in modo che punti all'area.

SecurityHelper ha anche il metodo extractSubFromJwtTokenHeader che utilizza l'oggetto InputEvent del metodo della funzione handleRequest per estrarre il token Bearer incluso nell'intestazione Authorization del gateway API. Sarà quindi possibile recuperare un token di accesso in seguito all'asserzione Oracle Identity Cloud Service.

Per ulteriori informazioni sull'uso e l'integrazione di idcsOAuthAsserter con una funzione, esaminare il file README per idcsOAuthAsserter nel repository dei codici con il campione di codice scaricabile visualizzato dal libro contabile della soluzione.

Imposta parametri di configurazione

L'ambiente Oracle Functions offre una funzionalità molto utile in cui è possibile definire alcuni parametri all'interno dell'ambiente Oracle Cloud Infrastructure e quindi farvi riferimento dal codice.

In questo caso d'uso, gli URL dei token Fusion e OverrideJWT verranno impostati e un flag denominato full_oauth, come parametri utilizzati nel codice. Per aggiungere parametri, procedere come segue.

  1. Dalla riga di comando:

    fn config function cloudnativesaas saasopportunitiesfn fusionhost <value>

    fn config function cloudnativesaas saasopportunitiesfn overridejwt <value>

    fn config function cloudnativesaas saasopportunitiesfn full_oauth <value>

  2. Dalla console:
    1. Selezionare Developer Services e Funzioni.
    2. In Applicazioni selezionare la funzione.
    3. Nella sezione Risorse selezionare Configurazione.
    4. Immettere le coppie chiave e valore per gli elementi riportati di seguito e fare clic sull'icona con il segno più per aggiungerli come parametri.
      • URL Fusion (chiave fusionhost )
      • URL token OverrideJWT (chiave overridejwt )
      • Usa flag OAuth completo (chiave full_oauth )
  3. Dal file yaml della funzione durante la distribuzione:
    config:
      fusionhost: <value>
      overridejwt: <value>
      full_oauth: <value>

All'interno del codice è possibile accedere a queste variabili di configurazione utilizzando Functions SDK utilizzando un'annotazione Java speciale (@FnConfiguration) e accedendo ai parametri mediante la variabile di contesto:

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);
    }

Inoltre, poiché questa soluzione utilizza la libreria di supporto idcsOAuthAsserter, è necessario fornire nella Configurazione funzioni le variabili specifiche descritte nella sezione precedente per utilizzare l'asserzione OAuth Oracle Identity Cloud Service per lo scambio dei token di accesso. Poiché questo processo richiede diverse configurazioni obbligatorie, si consiglia di impostare la configurazione della funzione utilizzando l'approccio file yaml. Ad esempio:

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>

Passare il token di autenticazione utente a Fusion Applications

La funzione deve gestire il token di autenticazione utente per le interazioni API REST sicure.

Se si richiama la funzione, verrà inviata anche una variabile di intestazione “autorizzazione” che conterrà un token di autenticazione. Questo token viene generato dal server delle identità dell'applicazione chiamante che è lo stesso server delle identità utilizzato dalla funzione gateway API Oracle Cloud Infrastructure per convalidare la richiesta.

L'approccio descritto in questa riproduzione di soluzioni consente di utilizzare l'asserzione JWT OAuth Oracle Identity Cloud Service per eseguire lo scambio di token mediante la libreria di supporto idcsOAuthAsserter. Fornisce un ulteriore layer di sicurezza per il richiamo da Oracle Functions a Oracle Fusion Applications Cloud Service. Come mostrato nel diagramma dell'architettura, la funzione con query di asserzione JWT OAuth per il token incluso nella chiamata in entrata dall'intestazione del gateway API e la utilizza per essere modificata da un altro token durante il processo di asserzione con Oracle Identity Cloud Service. Questo nuovo token verrà utilizzato nella chiamata in uscita al server di destinazione ( Oracle Fusion Applications Cloud Service ) e verrà eseguito ( Oracle Fusion Applications Cloud Service ) come utente in Oracle Visual Builder.

Nella funzione di esempio fornita (saasopportunitiesfn) è presente una configurazione denominata full_oauth che, per impostazione predefinita, è impostata su True e il funzionamento è descritto in precedenza.

Facoltativamente, è possibile impostare full_oauth su False. In questo caso, la funzione esegue una query sul token che viene inserito nella chiamata in entrata dall'intestazione del gateway API e lo utilizza nella chiamata in uscita a Oracle Fusion Applications Cloud Service. Nessun secondo token generato.

Lo snippet di codice seguente utilizza la libreria HTTP Apache e richiama l'API REST Oracle Fusion Applications Cloud Service utilizzando il token di autenticazione passato.

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();

Compila e distribuisci la funzione

In Oracle Functions creare un'applicazione per la funzione, quindi distribuire la funzione.

  1. Compilare il codice idcsOAuthAsserter prima della funzione per generare la dipendenza richiesta nel repository locale. ad esempio:
    $ cd <PATH_TO>/idcsOAuthAsserter
    $ mvn clean install
  2. Assicurarsi che la directory lib esista nella funzione allo stesso livello di yaml.func. Ad esempio, in questo caso il nome della funzione è saasopportunitiesfn. Compilare il codice utilizzando i comandi Maven per generare i file necessari, idcsOAuthAsserter-1.0.0.jar e idcsOAuthAsserter-1.0.0.pom, nella directory lib/:
    $ cd <PATH_TO>/saasopportunitiesfn
    $ mkdir -pv lib/
    $ mvn clean install
     
    $ ls lib/
    idcsOAuthAsserter-1.0.0.jar  idcsOAuthAsserter-1.0.0.pom
  3. È necessario utilizzare un Dockerfile per integrare la libreria idcsOAuthAsserter per la funzione. La funzione di esempio saasopportunitiesfn dispone già di un Dockerfile nell'esempio seguente. Se si è dietro un proxy, potrebbe essere necessario aggiornare le proprietà del Dockerfile con le proprietà del proxy richieste deselezionando la riga ENV MAVEN_OPTS. Inoltre, modificare la variabile MAVEN_OPTS delle proprietà del proxy nel Dockerfile, se necessario.
    
    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. Crea un'applicazione nel tuo compartimento in Oracle Functions:
    1. In una finestra di terminale, creare una nuova applicazione immettendo:
      $ fn create app <app-name> --annotation oracle.com/oci/subnetIds='["<subnet-ocid>"]'
      dove:
      • <app-name> è il nome della nuova applicazione. Evitare di fornire informazioni riservate.
      • <subnet-ocid> è l'OCID della subnet (o delle subnet, fino a un massimo di tre) in cui eseguire le funzioni. Se è stata definita una subnet regionale, è consigliabile selezionare tale subnet per eseguire il failover tra i domini di disponibilità in modo più semplice da implementare. Se non è stata definita una subnet regionale ed è necessario soddisfare i requisiti di alta disponibilità, specificare più subnet (racchiudere ogni OCID tra virgolette separate da virgole, nel formato '["<subnet-ocid>","<subnet-ocid>"]'). La Oracle consiglia di inserire le subnet nella stessa area del registro di Docker specificato nel contesto dell'interfaccia CLI di Fn Project.
    2. Verificare che la nuova applicazione sia stata creata immettendo:
      $ fn list apps
  5. Distribuire la funzione all'applicazione. ad esempio:
    $ cd <PATH_TO>/saasopportunitiesfn 
    $ fn deploy --app myapplication --verbose

Definisci facoltativamente una funzione di autenticazione in Oracle Cloud Infrastructure

Il gateway API Oracle Cloud Infrastructure supporta IDCS come provider di autenticazione. Tuttavia, il gateway consente anche la definizione di una funzione che può richiamare. Facoltativamente, è possibile creare una funzione di autenticazione custom utilizzando questa funzione.

La funzione di autenticazione personalizzata riceve una chiamata dal gateway, facendola precedere l'intestazione di autorizzazione in entrata. Se la funzione restituisce true, la chiamata di funzione è consentita. Se invece restituisce false, la richiesta viene rifiutata con un codice di errore HTTP 401. La funzione viene fornita nel formato del codice sorgente e viene distribuita all'interno delle funzioni, a cui viene quindi fatto riferimento nel file di distribuzione GATEWAY dell'API OCI mediante il relativo OCID. È possibile trovare l'OCID passando alla funzione distribuita nella console ed espandendone la colonna OCID. Prima di poter distribuire la funzione, è necessario modificare il file ResourceServerConfig.java, che definisce la modalità di connessione della funzione a Oracle Identity Cloud Service e l'applicazione Oracle Identity Cloud Service OAuth utilizzata.

L'esempio di funzione riportato di seguito evita valori riservati alla codifica complessa, ad esempio il segreto client. Nelle quattro righe sotto il commento // KMS Key for IDCS Client Secret, il codice decifra il segreto OAuth utilizzando la funzione di gestione delle chiavi di Oracle Cloud Infrastructure, Oracle Cloud Infrastructure Vault. Immettere questi valori nella console di Oracle Cloud Infrastructure prima di distribuire la funzione.

  1. Scrivere una funzione di autenticazione custom. ad esempio:
    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+"]");
        }
    }
    È necessario aggiungere alcuni valori di configurazione, ad esempio l'endpoint e il segreto Oracle Identity Cloud Service. Questi parametri di configurazione vengono immessi nella configurazione di Oracle Functions.
  2. Nella console di Oracle Cloud Infrastructure, passare a Developer Services e fare clic su Funzioni.
  3. Selezionare la funzione e in Risorse fare clic su Configurazione.
    È possibile immettere i valori per una qualsiasi delle variabili di configurazione definite nella funzione. I valori riservati sono protetti da Oracle Cloud Infrastructure Vault.
  4. Distribuire la funzione. ad esempio:
    fn deploy -app fnsaaspoc