تطوير الدوال

قبل توزيع توزيع بوابة API، ستحتاج إلى تطوير الوظائف وتوزيعها.

حول منطق الأعمال

رمز الخصم الخاص بالتنفيذ هو وضع رمز ما في دالة. قد يكون هذا الرمز معقدًا حسب الحاجة، أو استدعاء نقاط انتهاء متعددة أو ربما يؤدي لإجراء بعض التجميع. وظيفة منطق الأعمال هي التعليمات البرمجية التي سيتم استدعاؤها عند الحاجة بواسطة بوابة Oracle Cloud Infrastructure API.

في هذا المثال من البنية، تقوم جيت واي API باستدعاء دالة Oracle، والتي بدورها تقوم بالاستعلام عن بعض البيانات من Oracle Fusion Applications Cloud Service من خلال REST API، ومعالجتها، وإرجاعها إلى المستخدم. عند كتابة الدالة نفسها، يمكنك استخدام أي إطار عمل مناسب ترغب في استخدامه، ولكن يجب أن تكون على دراية بتأثير إطار عمل معين فيما يتعلق بوظائف الخادم الأقل. في هذا المثال، قمنا باستخدام Java كلغة ومكتبة Apache HttpClient للاتصال بخدمة REST Service. تم اختيار مكتبة Apache لأنها كانت سهلة الاستخدام وتسهل في تنفيذها ؛ على الرغم من أنه في Java 11 كان لدينا الآن عميل HTTP جديد يمكن استخدامه أيضًا.

كما يجب تجنب تعامل الكثير من الكائنات المستخدمة في الذاكرة عند استدعاء واجهات Api لـ REST، ومن ثم سيتم تجاهل تلك الكائنات على كل استدعاء، ومن ثم يتم إبطال تنفيذ الدالة.

حول الحصول على أسماء المستخدمين والأدوار

عند استدعاء دالة بواسطة جيت واي 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");

يمكن استخدام اسم المستخدم داخل الوظيفة لتنفيذ منطق الأعمال كما هو مطلوب. الأدوار غير متاحة في الرمز المميز للتصديق، على أنه يمكن الاستعلام عنها من Oracle Identity Cloud Service باستخدام REST api.

عندما يستدعي Oracle API Gateway الدالة، يتم أيضًا إرسال عدد من الرؤوس المفيدة. ويمكن قراءة هذه الرؤوس باستخدام واجهة API للدالة. تتضمن الرؤوس المفيدة المتاحة من Functions Developer Kit ما يلي:

على سبيل المثال، باستخدام توليفة من Fn - Https - method وFn - Http - Url يمكنك تنفيذ موجه في رمزك بحيث تقوم الوظيفة بعمل أشياء مرتبطة مختلفة بناءً على كيفية استدعائها (مثل PUT, PATCH, إلخ). هذا الأسلوب غالبًا ما يُسمى نمط “خدمة أقل "ويتميز المطور بالاحتفاظ بوظائف أقل ويكون لكل دالة موجه صغير يحدد ما يحتاجون عمله.

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

حول استدعاء Oracle Fusion Applications Cloud Service باستخدام مقطع الوصول لتأكيد JWT

يجب تنفيذ تأكيد JWT من Oracle Functions باستخدام الموضوع في رأس رسالة الاعتماد الواردة.

يمكن لوظيفة العينة المتوفرة مع دفتر تشغيل هذا الحل تنفيذ عملية التأمين هذه باستخدام مكتبة مساعد باسم idcsOAuthAsserter. تنفذ مكتبة المساعد تدفق تأكيد OAuth الكامل عن طريق إجراء تبادل مقاطع bearer قبل استدعاء Oracle Fusion Applications Cloud Service. هذه المكتبة متكاملة مع وظيفة العينة.

تتطلب الدالة توفر المفتاح الخاص والشهادة العامة لإنشاء تأكيدات المستخدم والعميل المستخدمة لاستدعاء Oracle Identity Cloud Service لتكوين مقطع وصول قاعدة بيانات bearer جديد باستخدام تأكيد OAuth JWT.

تتطلب المكتبة idcsOAuthAsserter بعض الخصائص التي يمكنك تعريفها في تكوين الدالة. جميع المتغيرات في الجدول التالي إلزامية:

اسم التكوين الوصف مثال
IDCS_URL عنوان URL لطبعة Oracle Identity Cloud Service https ://<عنوان مضيف الخدمة السحابية للهوية.identity.oraclecloud.com>
CLIENT_ID معرف عميل تطبيق Oracle Identity Cloud Service المقترن بـ Oracle Functions وOracle API Gateway 1a2b3c4d5e6f7g8h9i01j2k3l4m5o6p7
KEY_ID الاسم البديل للشهادات التي تم استيرادها إلى تطبيق Oracle Identity Cloud Service الموثوق به fnassertionkey
المجال يجب أن يكون هذا المجال مطابقًا لمورد OAuth الهدف، وهو تطبيق Oracle Identity Cloud Service المقترن بـ Oracle Fusion Applications Cloud Service urn:opc:resource:fa:instanceid=xxxxxxxurn: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 شهادة ومفتاح خاص لإنشاء تأكيدات العميل والمستخدم. تسترجع الدالة مخزن المفاتيح باستخدام OCID المحدد في V_KEYSTORE. الاسم البديل لاسترجاع هذه المعلومات يجب أن تتطابق مع قيمة KEY_ID في التكوين. يجب استرجاع عبارة المرور لكل من مخزن المفاتيح ومفتاح الخصوصية من خدمة قطاعات Oracle Cloud Infrastructure Vault باستخدام OCIDs المحدد في V_KS_PASS وV_PK_PASS.

اسم التكوين الوصف مثال
V_KEYSTORE سري يحتوي على المحتوى الآمن المخزن لمخزن المفاتيح ocid1.vaultsecret.oc1.dc1.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
V_KS_PASS كلمة السر السرية التي تحتوي على كلمة السر المخزنة الآمنة لمخزن المفاتيح ocid1.vaultsecret.oc1.dc1.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
V_PK_PASS كلمة السر التي تحتوي على كلمة السر المخزنة المؤمنة للمفتاح الخاص ocid1.vaultsecret.oc1.dc1.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

قيمة تكوين إضافية مدعومة هي الخاصية USE_CACHE_TOKEN، وهي معينة إلى True بشكل افتراضي. تسمح لك هذه الخاصية بتخزين مقطع تأكيد Oracle Identity Cloud Service الذي تم إنشاؤه ليتم إعادة استخدامه في مخازن Oracle Fusion Applications Cloud Service المستقبلية، طالما ظلت المقاطع صالحة. يتم تدقيق المقطع المخزن في الذاكرة المخبئية قبل استخدامه بمقارنة الموضوع بالمقطع الوارد والتحقق من وقت انتهاء الصلاحية للتحقق مما إذا كان صالحًا أم لا. في حالة عدم حدوث ذلك، يتم طلب مقطع وصول جديد باستخدام تأكيد OAuth. يمكن تعطيل هذه السمة عن طريق تعيين USE_CACHE_TOKEN إلى False.

يمكن أن تستخدم الدالة المطلوب تنفيذها SecurityHelper object من مكتبة idcsOAuthAsserter لاستخراج الموضوع من رأس access-token، وإنشاء مقطع وصول إلى حامل جديد يشتمل على تأكيد OAuth JWT، وإرسال طلب إلى Oracle Fusion Applications Cloud Service باستخدام مقطع الوصول الجديد كرأس Authorization.

الدالة saasopportunitiesfn في عينة التعليمات البرمجية المصدر متكاملة بالفعل مع مكتبة idcsOAuthAsserter. جزء التعليمات البرمجية التالي متاح في handleRequest metdhod الخاص بوظيفة العينة، والذي يعرض كيفية تهيئة كائنات 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. سيستخدم هذا في تهيئة SecurityHelper بتكوين مكتبة idcsOAuthAsserter Helper.

تم تعيين مثال دالة saasopportunitiesfn لاستخدام المنطقة US_PHOENIX_1، لذا يجب عليك تغيير المنطقة في الأسلوب setOciRegion المعروض في المقطع للإشارة إلى المنطقة الخاصة بك.

SecurityHelper تشتمل أيضًا على الأسلوب extractSubFromJwtTokenHeader الذي يأخذ كائن InputEvent من أسلوب الدالة handleRequest لاستخراج مقطع الحامل الذي يأتي في رأس بوابة API Authorization. ثم يجب أن تكون قادرًا على استرجاع مقطع الوصول كنتيجة لتأكيد Oracle Identity Cloud Service.

لمزيد من المعلومات حول استخدام idcsOAuthAsserter وتكامله مع دالة، راجع الملف README الخاص بـ idcsOAuthAsserter في مخزن الرموز باستخدام عينة التعليمات البرمجية القابلة للتنزيل المصاحبة لسجل تشغيل هذا الحل.

تعيين معلمات التكوين

توفر بيئة Oracle Functions جزءًا مفيدًا جدًا من الوظائف حيث يمكنك تعريف بعض المعلمات في بيئة Oracle Cloud Infrastructure ثم الإشارة إليها من التعليمات البرمجية.

في حالة الاستخدام هذه يتم تعيين عناوين URL لمقطع Fusion وOverrideJWT وعلامة تسمى 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. أدخل أزواج المفاتيح والقيمة للعناصر التالية وانقر على أيقونة علامة الجمع لإضافتها كمعاملات.
      • عنوان URL لـ Fusion (مفتاح fusionhost)
      • عنوان URL لمقطع OverrideJWT (تجاوز المفتاح)
      • استخدام علامة OAuth كاملة (مفتاح full_oauth)
  3. من ملف yaml الخاص بالوظيفة أثناء وقت التوزيع:
    config:
      fusionhost: <value>
      overridejwt: <value>
      full_oauth: <value>

ضمن التعليمات البرمجية، يمكنك الوصول إلى متغيرات التكوين هذه باستخدام ملف SDK الخاص باستخدام تعليق Java التوضيحي (@FnConfiguration) الخاص والوصول إلى المعلمات من خلال متغير السياق:

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، ستحتاج إلى توفير المتغيرات المحددة الموضحة في القسم السابق لاستخدام تأكيد 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 لتدقيق الطلب.

يمثك الأسلوب الموضح في دفتر تشغيل هذا الحل في استخدام تأكيد Oracle Identity Cloud Service OAuth JWT لإجراء تبادل المقاطع باستخدام مكتبة مساعد idcsOAuthAsserter. يوفر هذا طبقة تأمين إضافية للاستدعاء من Oracle Functions إلى Oracle Fusion Applications Cloud Service. كما هو موضح في الرسم التخطيطي للبنية، تقوم الوظيفة باستعلامات تأكيد OAuth JWT للمقطع الذي يأتي في استدعاء الوارد من عنوان بوابة واجهة برمجة التطبيقات ويستخدمها لمقطع آخر أثناء عملية التأكيد مع Oracle Identity Cloud Service. سيتم استخدام هذا المقطع الجديد في الاستدعاء الخارجي لخادم الوجهة (Oracle Fusion Applications Cloud Service) وسيقوم (Oracle Fusion Applications Cloud Service) بتنفيذ الاستدعاء كمستخدم في Oracle Visual Builder.

في دالة العينة المتوفرة (saasopportunitiesfn)، يوجد تكوين بالاسم full_oauth، والذي يتم تعيينه بشكل افتراضي على True، وسيكون السلوك الموضح أعلاه.

بشكل اختياري، يمكنك تعيين full_oauth إلى False. وفي هذه الحالة، تقوم الوظيفة بالاستعلام عن المقطع الذي يأتي في المكالمة الواردة من عنوان بوابة واجهة برمجة التطبيقات (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. قم بتجميع التعليمات البرمجية باستخدام أوامر Maven لإنشاء ملفات ضرورية، idcsOAuthAsserter-1.0.0.jar وidcsOAuthAsserter-1.0.0.pom في الدليل lib/:
    $ 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 في المثال التالي بالفعل. إذا كنت خلف بروكسي، فقد تحتاج إلى تحديث خصائص Dockerfile باستخدام خصائص البروكسي المطلوبة من خلال إلغاء تثبيت سطر ENV MAVEN_OPTS. كذلك، قم بتعديل متغير MAVEN_OPTS الخاص بخصائص البروكسي في ملف Dockerfile إذا لزم الأمر.
    
    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 الخاص بصافي فرعي (أو شبكة فرعية، بحد أقصى ثلاثة) الذي يتم تشغيل الدوال فيه. في حالة تعريف صافي فرعي إقليمي، من الأفضل أداء تحديد أن تجعل الشبكة الفرعية عملية الانتقال عقب الفشل عبر نطاقات الإتاحة سهلة للتنفيذ. إذا لم يتم تعريف صافي فرعي إقليمي ويجب أن تفي بالمتطلبات العالية للإتاحة، فقم بتحديد عدة أصول فرعية (تضم كل OCID بين علامتي اقتباس مزدوجتين بفواصل، بالصيغة '["<subnet-ocid>","<subnet-ocid>"]'). توصي Oracle بأن يكون صافي القيم الفرعية في نفس المنطقة بسجل Docker المحدد في سياق CLI لمشروع Fn.
    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. يتم توفير الدالة في صيغة التعليمات البرمجية المصدر ويتم توزيعها ضمن الدوال، والتي تتم الإشارة إليها بعد ذلك في ملف توزيع OCI API gatecy عبر OCID الخاص بها. يمكنك اكتشاف Ocd عبر الانتقال إلى الدالة الموزعة في وحدة التحكم وتوسيع عمود OCID الخاص بها. قبل التمكن من توزيع الدالة ، يلزم تحرير الملف ResourceServerConfig.java ؛ وهو يحدد كيفية اتصال الدالة بـ Oracle Identity Cloud Service ومن ثم استخدام تطبيق Oracle Identity Cloud Service OAuth.

إن مثال الدالة أدناه يمنع مشاركة قيم البيانات الحساسة مثل كلمة سر العميل. في السطور الأربعة أسفل التعليق // KMS Key for IDCS Client Secret، تقوم التعليمات البرمجية بفك تشفير بيانات OAuth secret باستخدام سمة إدارة مفاتيح Oracle Cloud Infrastructure، وOracle Cloud Infrastructure Vault. يمكن إدخال هذه القيم في وحدة تحكم 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، انتقل إلى خدمات المطور، وانقر على الوظائف.
  3. حدد الوظيفة، ثم أسفل الموارد، انقر تكوين.
    يمكنك إدخال قيم لأي من متغيرات التركيب المحددة في الوظيفة يتم تأمين القيم الحساسة بواسطة Oracle Cloud Infrastructure Vault.
  4. توزيع الدالة. على سبيل المثال:
    fn deploy -app fnsaaspoc