Synology SSO Server-从站点管理授权和访问服务

前一段时间,我面临着一项任务,即为了保护客户的商业秘密,拒绝使用第三方云服务。



首先也是最合乎逻辑的事情是让他们访问已经可用的Synology。



然后,人们希望用精美的方式做到这一点,而不是使用单独的用户名/密码,而要使用早先从个人帐户发出的用户名/密码。您需要从个人帐户无缝过渡到Synology服务。



说明和脚本下切。



为了进行进一步的工作,我们需要安装一个LDAP服务器和SSO服务器。

SSO服务器是Synology的专有OAuth2.0实现。



我们配置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服务器>应用程序列表>添加>输入SSO_Oauth.php脚本的名称和URI地址。单击“确定”后,将生成应用程序ID。需要将其复制并放置在我们的config.php> APP_ID中



因此,如果用户通过SSO在您的站点上获得了授权,则通过单击指向他可以在LDAP中访问的任何Synology服务的链接,他将不必重新授权。反之亦然-如果他在您的云中被授权,那么该站点上的个人帐户也将可用。



事实证明并非如此简单。我在网络上仅找到一个关于此API的指南-Synology SSO API指南,但是所有操作都是通过ajax在客户端完成的,由于某种原因,它没有检测到用户已获得授权,而且运行缓慢。因此,我必须找到自己的解决方案,但事实证明它要短得多且简单得多。



如果它对其他人有用,我会很高兴。



All Articles