تعرف على التصديق بين تطبيقات Node.js و Oracle Identity Cloud Service

أنت جاهز للتعرف على التصديق بين تطبيقات ويب Node.js و Oracle Identity Cloud Service. ويتضمن ذلك فهم ما يلي:

  • تدفق التصديق ثلاثي المحطات الذي يدعمه Oracle Identity Cloud Service لـ Node.js SDK

  • استخدام حالات استخدام SDK مع تطبيق Node.js للتصديق مع Oracle Identity Cloud Service

  • طرق ووظائف Node.js SDK

تعرف على تدفقات التصديق ثلاثية الأبعاد

يدعم Oracle Identity Cloud Service تدفق التصديق ثلاثي المحطات لـ Node.js SDK. في هذا التدفق ، يتفاعل المستخدمون مباشرة مع Oracle Identity Cloud Service. بعد قيام المستخدم بتسجيل الدخول ، يصدر Oracle Identity Cloud Service رمز اعتماد يخول SDK لمقطع وصول المستخدم. يستخدم تطبيق الويب Node.js مقطع الوصول هذا لمنح المستخدمين حق الوصول إلى الموارد المحمية في التطبيق. يستخدم التدفق المكون من ثلاث مراحل نوع منح رمز الصلاحية.

لزيادة التأمين ، توصي أوراكل باستخدام التدفق ثلاثي المحطات لتكامل تطبيقات الويب Node.js مع خدمة Oracle Identity Cloud للتصديق. باستخدام نوع منح رمز الاعتماد ، يمكنك أيضًا الوصول إلى التطبيقات الأخرى المحمية بواسطة Oracle Identity Cloud Service دون الحاجة إلى إعادة التصديق.

التعرف على حالات الاستخدام الأساسية لاستخدام SDK مع تطبيق Node.js

يقوم تطبيق الويب Node.js بتنفيذ حالتا استخدام: أحدهما للتصديق على المستخدمين ، والأخرى للوصول إلى معلومات تفصيلية عن المستخدم الذي قام بالدخول.

توضح مخططات تدفق البيانات التالية تدفق الأحداث والمكالمات والاستجابات بين مستعرض الويب وتطبيق الويب Oracle Identity Cloud Service لكل حالة استخدام.

استخدام الحالة #1: تصديق مستخدم

يحدث تدفق البيانات بهذه الطريقة:

  1. يطلب المستخدم موردًا محميًا.

  2. تستخدم الوحدة النمطية للتصديق SDK لإنشاء عنوان URL لطلب الاعتماد الخاص بـ Oracle Identity Cloud Service وإرسال عنوان URL هذا كاستجابة إعادة التوجيه إلى متصفح الويب.

  3. يستدعي مستعرض الويب عنوان URL.

  4. تظهر صفحة تسجيل الدخول إلى Oracle Identity Cloud Service.

  5. يقوم المستخدم بتقديم بيانات اعتماد تسجيل الدخول إلى Oracle Identity Cloud Service.

  6. بعد قيام المستخدم بتسجيل الدخول ، يقوم Oracle Identity Cloud Service بتكوين جلسة عمل للمستخدم وإصدار رمز اعتماد.

  7. يقوم تطبيق الويب باستدعاء الخلفية (أو الخادم إلى الخادم) لاستبدال رمز الاعتماد الخاص بمقطع وصول المستخدم.

  8. يُصدر Oracle Identity Cloud Service مقطع الوصول.

  9. يتم إنشاء جلسة عمل ، وتتم إعادة توجيه المستخدم إلى الصفحة الرئيسية .

  10. تظهر الصفحة الرئيسية لتطبيق الويب.

حالة الاستخدام #2: الحصول على تفاصيل حول المستخدم

يحدث تدفق البيانات بهذه الطريقة:

  1. يطلب المستخدم مورد /myProfile.

  2. يستدعي تطبيق الويب Oracle Identity Cloud Service باستخدام SDK ، والذي يستخدم مقطع الوصول المخزن في جلسة عمل المستخدم كمعلمة.

  3. يتم إرسال بيانات المستخدم إلى تطبيق الويب ككائن JSON.

  4. تقدم صفحة مرجعي كائن JSON كمحتوى HTML.

تعرف على الطرق والوظائف

تعد Node.js SDK إستراتيجية جواز سفر Node.js التي أضفتها إلى مجلد Node.js modules. يقوم SDK أيضًا على أساس وعد Node.js. كل تبعيات الطرف الثالث التي تحتاج إلى Node.js SDK في ملف package.json الخاص بـ SDK. يجب عليك استخدام مجموعة الوحدات هذه على الأقل في تطبيق ويب Node.js الخاص بك.

"dependencies": {
    "async": "^2.1.2",
    "bunyan": "^1.8.5",
    "cache-manager": "^2.2.0",
    "json-web-token": "^2.1.3",
    "jsonwebtoken": "^7.1.9",
    "jwk-to-pem": "^1.2.6",
    "jws": "^3.1.4",
    "lru": "^3.1.0",
    "passport": "^0.3.2",
    "promise": "^7.1.1",
    "querystring": "^0.2.0",
    "request": "^2.79.0",
    "rsa-pem-to-jwk": "^1.1.3",
    "util": "^0.10.3"
  },

تم تطوير تطبيق ويب Node.js باستخدام الوحدات النمطية Node.js express و&express-handlebars ، التي تنفذ توجيهات URL في شكل دالة app.get() لكل عنوان URL.

يتطلب Node.js SDK متغير JSON تم تحميله باستخدام معلومات اتصال Oracle Identity Cloud Service. يستخدم تطبيق الويب Node.js متغير ids لتخزين هذه المعلومات:

var ids = {
    oracle: {
         "ClientId": '123456789abcdefghij',
         "ClientSecret": 'abcde-12345-zyxvu-98765-qwerty',
         "ClientTenant": 'idcs-abcd1234',
         "IDCSHost": 'https://%tenant%.identity.oraclecloud.com',
         "AudienceServiceUrl" : 'https://idcs-abcd1234.identity.oraclecloud.com',
         "TokenIssuer": 'https://identity.oraclecloud.com/',
         "scope": 'urn:opc:idm:t.user.me openid',
         "logoutSufix": '/oauth2/v1/userlogout',
         "redirectURL": 'http://localhost:3000/callback'
    }
};
 
module.exports = ids;

فيما يلي شرح مختصر لكل سمة مطلوبة لـ SDK:

الاسم البيان
ClientId قيمة معرف العميل التي يتم إنشاؤها بعد تسجيل تطبيق ويب Node.js في وحدة تحكم Identity Cloud Service.
ClientSecret قيمة كلمة سر العميل التي يتم إنشاؤها بعد تسجيل تطبيق ويب Node.js في وحدة تحكم Identity Cloud Service.
ClientTenant بادئة النطاق لطبعة Oracle Identity Cloud Service. عادة ما تكون هذه البادئة مماثلة لـ idcs-abcd1234.
IDCSHost لاحقة النطاق لطبعة Oracle Identity Cloud Service. في وقت التشغيل ، يتم استبدال متغير التعويض %المقيم بالنسبة لقيمة سمة ClientTenant.
AudienceServiceUrl عنوان URL لاسم النطاق المؤهل بالكامل لطبعة Oracle Identity Cloud Service.
TokenIssuer بالنسبة لهذه السمة ، توصي Oracle بالاحتفاظ بالقيمة https://identity.oraclecloud.com/.
scope

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

إذا استخدم التطبيق SDK لتصديق مستخدم ، يكون المجال هو openid. إذا استخدم التطبيق SDK للحصول على تفاصيل حول المستخدم ، يكون المجال هو urn:opc:idm:t.user.me openid.

يستخدم التطبيق كل من سمتي logoutSufix و redirectURL. لا تتطلب SDK أي منها.

يقوم تطبيق Node.js بتنفيذ توجيه عنوان URL لـ /oauth/oracle. عندما يقرر المستخدم التصديق مع Oracle Identity Cloud Service، يقوم متصفح الويب بعمل طلب إلى عنوان URL هذا. يستخدم هذا التوجيه SDK لتكوين URL للاعتماد الخاص بـ Oracle Identity Cloud Service.

//Loading the configurations
var auth = require('./auth.js');
 
//Route for /oauth/oracle
app.get("/auth/oracle", function(req, res){
    //Authentication Manager loaded with the configurations.
    am = new IdcsAuthenticationManager(auth.oracle);
    //Using Authentication Manager to generate the Authorization Code URL, passing the
    //application's callback URL as parameter, along with code value and code parameter.
    am.getAuthorizationCodeUrl(auth.oracle.redirectURL, auth.oracle.scope, "1234", "code")
        .then(function(authZurl){
            //Redirecting the browser to the Oracle Identity Cloud Service Authorization URL.
            res.redirect(authZurl);
        }).catch(function(err){
            res.end(err);
        })
});

تقوم هذه الدالة بتحميل معلمات JSON إلى متغير ، مع تهيئة مدير التصديق ، واستخدام دالة IdcsAuthenticationManager.getAuthorizationCodeUrl() في Node.js SDK لإنشاء عنوان URL لرمز الاعتماد. تستخدم هذه الدالة "الوعد" إما لإعادة توجيه متصفح الويب للمستخدم عند إنشاء عنوان URL لرمز الاعتماد أو لعرض خطأ في المتصفح.

تستخدم المعاملات التالية لتكوين URL رمز الصلاحية:

الاسم البيان
auth.oracle.redirectURL بعد قيام المستخدم بتسجيل الدخول ، يقوم Oracle Identity Cloud Service بإعادة توجيه مستعرض الويب الخاص بالمستخدم إلى عنوان URL هذا. يجب أن يتطابق عنوان URL هذا مع العنوان الذي ستقوم بتكوينه للتطبيق الموثوق به في وحدة تحكم Identity Cloud Service. يرجى الاطلاع على تسجيل تطبيق Node.js لمزيد من المعلومات حول تحديد عنوان URL لإعادة التوجيه لتطبيق ويب Node.js.
auth.oracle.scope مجال OAuth أو OpenID Connect الخاص بالتصديق. يتطلب هذا التطبيق تصديق openid فقط.
state يقوم بروتوكول OAuth بتعريف هذه المعلمة. يستخدم تطبيق ويب Node.js هذا الرمز للتحقق من إمكانية إنشاء اتصال بـ Oracle Identity Cloud Service. على سبيل المثال ، قيمة هذه المعلمة هي 1234.
response_type المعامل المطلوب بواسطة نوع منح رمز الصلاحية. على سبيل المثال ، قيمة هذه المعلمة هي code.

بعد قيام المستخدم بتسجيل الدخول ، يقوم Oracle Identity Cloud Service بإعادة توجيه مستعرض الويب الخاص بالمستخدم إلى عنوان URL للاستدعاء ، والذي يجب على المطور تنفيذه. يستخدم تطبيق الويب Node.js توجيه /callback لمعالجة هذا الطلب.

//Route for /callback
app.get("/callback", function(req,res){
    //Authentication Manager loaded with the configurations.
    var am = new IdcsAuthenticationManager(auth.oracle);
    //Getting the authorization code from the "code" parameter
    var authZcode = req.query.code;
    //Using the Authentication Manager to exchange the Authorization Code to an Access Token.
    am.authorizationCode(authZcode)
        .then(function(result){
            //Getting the Access Token Value.
            res.cookie(config.IDCS_COOKIE_NAME, result.access_token);
            res.redirect('/auth.html');
        }).catch(function(err){
            res.end(err);
        })
});

يستخدم تطبيق Node.js رمز الاعتماد لطلب مقطع وصول. يتم تخزين مقطع الوصول كملف تعريف ارتباط ، ويتم إرساله بعد ذلك إلى متصفح الويب للاستخدام في المستقبل.

كما تستخدم دالة IdcsAuthenticationManager.authorizationCode() في Node.js SDK أيضًا الوعد (جملة التجميع تلك) لتعيين مقطع الوصول كملف تعريف ارتباط ، ولإعادة توجيه المتصفح إلى صفحة /auth.html.

يستند Node.js SDK إلى إطار عمل جواز سفر Node.js. وبالتالي ، يتعين عليك إعادة توجيه مقطع الوصول كمتغير رأس إلى مرجع عنوان URL الخاص بـ /auth، واستخدام أسلوب passport.authenticate() مع اسم إستراتيجية Oracle Identity Cloud Service كمعلمة:

//Uses passport to create a User Session in Node.js.
//Passport sets a user attribute in the request as a json object.
app.get('/auth', passport.authenticate(config.IDCS_STRATEGY_NAME, {}), function(req, res) {
   res.redirect('/home');
});

بعد أن يقوم أسلوب passport.authenticate() بتكوين جلسة عمل التطبيق ، تقوم الدالة بإعادة توجيه متصفح ويب المستخدم إلى عنوان URL محمي في تطبيق /home. بالإضافة إلى /home ، يشتمل تطبيق ويب Node.js على ثلاثة عناوين URL محمية أخرى: /appDetails و /userInfo و /myProfile .

تحتاج كل عنوان URL محمي إلى التحقق مما إذا كانت جلسة عمل المستخدم قد تم تكوينها مسبقًا. يتم استخدام الدالة التالية بواسطة كل دالة app.get() لهذه URLs.

function ensureAuthenticated(req, res, next) {
   if (req.isAuthenticated()) {
      return next();
   }
   res.redirect('/login')
}

يعالج تطبيق Node.js توجيه /myProfile ويحصل على المعلومات التي تم تعيينها في جلسة العمل بواسطة طريقة passport.authenticate()، كما يلي:

app.get("/myProfile", ensureAuthenticated, function(req,res){
   //User Manager loaded with the configurations
   var um = new IdcsUserManager(auth.oracle);
   //Using the user id in the request attribute to render the user json in the screen.
   um.getUser(req.user.id)
      .then(function(user){
         res.render('myProfile', {
         layout: 'privateLayout',
         title: 'My Profile',
         user: req.user,
         userInfo: JSON.stringify(user, null, 2)
         });
      }).catch(function(err1){
         res.end(err1);
      })
});

بعد تهيئة كائن UserManager، يستخدم مرجع توجيه /myProfile دالة IdcsUserManager.getUser() الخاصة بـ SDK للحصول على كائن JSON الذي يمثل ملف تعريف المستخدم. يرسل التطبيق كائن JSON إلى ملف myProfile.handlebars لعرضه في متصفح الويب.

لتوقيع المستخدم من الدخول الموحد بين التطبيق و Oracle Identity Cloud Service ، يقوم تطبيق ويب Node.js بتنفيذ توجيه /logout، كما يلي:

app.get('/logout', function(req, res){
   req.logout();
   res.clearCookie();
   res.redirect(auth.oracle.IDCSHost + auth.oracle.logoutSufix);
});

يقوم هذا المسار بإلغاء صلاحية جلسة عمل التطبيق ، وإزالة أية ملفات تعريف ارتباط تم تعيينها سابقًا ، ثم إعادة توجيه متصفح الويب الخاص بالمستخدم إلى عنوان URL للخروج من OAuth الخاص بـ Oracle Identity Cloud Service. يتم إعداد عنوان URL هذا في كائن تكوين JSON.