؛ Synology SSO Server - إدارة خدمات التفويض والوصول من الموقع

منذ بعض الوقت ، واجهت مهمة حماية الأسرار التجارية لعملائي ، رفض استخدام الخدمات السحابية لجهات خارجية.



الشيء الأول والأكثر منطقية هو منحهم حق الوصول إلى Synology المتاح بالفعل.



ثم كانت هناك رغبة في القيام بذلك بشكل جميل ، ليس باستخدام اسم مستخدم / كلمة مرور منفصلة ، ولكن باستخدام تلك التي تم إصدارها مسبقًا من الحساب الشخصي. ما تحتاجه هو الانتقال "السلس" من حسابك الشخصي إلى خدمات Synology.



الوصف والنص تحت الخفض.



لمزيد من العمل ، نحتاج إلى خادم LDAP مثبت وخادم SSO.

خادم SSO هو تطبيق OAuth2.0 الخاص بـ Synology.



نقوم بتكوين LDAP وإنشاء المستخدم المطلوب ، وتعيين حقوق الوصول إلى الخدمات له.



بعد ذلك ، يتم تشغيل نص php الذي كتبته ، والذي قمنا بتثبيته على الموقع. إنه ليس كبيرًا ومتوفر على GitHub .



الأمر بسيط معه. قم بالتنزيل ووضعه على الموقع في / المجلد الخاص بي.



في config.php ، تحتاج إلى استبدال القيم التالية بقيمك الخاصة:



config.php
<?php

define('APP_ID', 'a8d0f0835eda3517f3e8fd70c10500e7');
define('SSO_HOST', 'https://DSM:5001');
define('LOCAL_HOST', 'https://yourwebsite.ru');
define('REDIRECT_URI', 'https://yourwebsite.ru/my/SSO_Oauth.php');

?>




  • APP_ID - ستحصل عليه في الخطوة التالية ، عند التسجيل باستخدام خادم SSO
  • SSO_HOST هو عنوان المضيف للوصول إلى Synology
  • LOCAL_HOST - عنوان الموقع الذي يوجد عليه البرنامج النصي
  • REDIRECT_URI - العنوان حيث يتوفر البرنامج النصي SSO_Oauth.php


في index.php (تم وضع علامة على المكان) أضف المزيد من المنطق أو عمليات إعادة التوجيه بعد أن يتم تسجيل دخول المستخدم بنجاح



index.php
<?php
session_start();

include_once('config.php');

if (!isset($_SESSION['user_id'])) {
  header('location: '.SSO_HOST.'/webman/sso/SSOOauth.cgi?app_id='.APP_ID.'&scope=user_id&redirect_uri='.REDIRECT_URI);
}

if (isset($_GET['logout'])) {
  unset($_SESSION['user_id']);
  header('location: '.LOCAL_HOST);
}

// here we can do something after login
echo 'User ID:'.$_SESSION['user_id'].' logged in';

?>




حسنًا ، نص معالجة الطلب نفسه:



SSO_Oauth.php
<?php
session_start();

include_once('config.php');

if (isset($_GET['access_token'])) {
  $access_token = $_GET['access_token'];
  $resp = file_get_contents(SSO_HOST.'/webman/sso/SSOAccessToken.cgi?action=exchange&access_token='.$access_token.'&app_id='.APP_ID);
  $json_resp = json_decode($resp, true);

  if($json_resp['success'] == true){
    $_SESSION['user_id'] = $json_resp["data"]["user_id"];
    header('location: '.LOCAL_HOST.'/my/');
  }
  exit();
}

?>

<html>
<body>
  <script>
    var get = window.location.hash.substr(1);
    if (get) {
      window.location.href = "<?=REDIRECT_URI?>?" + get;
    }
  </script>
</body>
</html>





بعد ذلك ، تحتاج إلى ربط التفويض على الموقع من خلال خادم SSO. كل شيء بسيط للغاية فيه - افتح خادم SSO > قائمة التطبيقات > إضافة > أدخل الاسم وعنوان URI إلى البرنامج النصي SSO_Oauth.php. بعد النقر فوق "موافق" ، سيتم إنشاء معرف التطبيق . يجب نسخه ووضعه في config.php> APP_ID .



وبالتالي ، إذا تم التصريح للمستخدم بالدخول إلى موقعك من خلال الدخول الموحد ، ثم النقر على رابط لأي من خدمات Synology التي يمكنه الوصول إليها في LDAP ، فلن يضطر إلى إعادة التفويض. هذا صحيح في الاتجاه المعاكس - إذا تم تفويضه في السحابة الخاصة بك ، فسيكون الحساب الشخصي على الموقع متاحًا أيضًا.



تبين أن التنفيذ ليس بهذه البساطة. لقد وجدت دليلًا واحدًا فقط على واجهة برمجة التطبيقات هذه على الشبكة - دليل Synology SSO API ، ولكن كل شيء يتم من جانب العميل عبر ajax ولسبب ما لم يتم اكتشاف أن المستخدم قد تم ترخيصه ، كما أنه عمل ببطء شديد. لذلك ، كان علي أن أجد الحل الخاص بي ، لكن اتضح أنه أقصر وأبسط بكثير.



سأكون سعيدًا إذا كان مفيدًا لشخص آخر.



All Articles