Synology SSO Server: gestione los servicios de autorización y acceso desde el sitio

Hace algún tiempo, me enfrenté a la tarea, para proteger los secretos comerciales de mis clientes, de negarme a utilizar servicios en la nube de terceros.



Lo primero y más lógico es darles acceso a Synology ya disponible.



Y luego hubo un deseo de hacerlo maravillosamente, no con un nombre de usuario / contraseña separados, sino usando los que ya se emitieron anteriormente desde la cuenta personal. Lo que necesita es una transición perfecta de su cuenta personal a los servicios de Synology.



Descripción y guión debajo del corte.



Para seguir trabajando, necesitamos un servidor LDAP y un servidor SSO instalados.

SSO Server es la implementación de OAuth2.0 propiedad de Synology.



Configuramos LDAP y creamos el usuario deseado, establecemos derechos de acceso a los servicios para él.



Luego, el script php que escribí, que instalamos en el sitio, entra en funcionamiento. No es grande y está disponible en GitHub .



Con él es sencillo. Descargue y coloque en el sitio en la carpeta / my.



En config.php , debe reemplazar los siguientes valores con los suyos:



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: lo obtendrá en el siguiente paso, cuando se registre con el servidor SSO
  • SSO_HOST es la dirección de host para acceder a Synology
  • LOCAL_HOST: la dirección del sitio en el que se encuentra el script
  • REDIRECT_URI: la dirección donde está disponible el script SSO_Oauth.php


En index.php (lugar indicado) agregue más lógica o redireccionamientos después de que el usuario haya iniciado sesión correctamente.



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';

?>




Bueno, el propio script de procesamiento de solicitudes:



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>





A continuación, debe vincular la autorización en el sitio a través del servidor SSO. Todo es bastante simple en él: abra SSO Server > Lista de aplicaciones > Agregar > Ingrese el nombre y la dirección URI en el script SSO_Oauth.php. Después de hacer clic en "Aceptar", se generará el ID de la aplicación . Debe copiarse y colocarse en nuestro config.php> APP_ID .



Por lo tanto, si un usuario está autorizado en su sitio a través de SSO, al hacer clic en un enlace a cualquiera de los servicios de Synology a los que tiene acceso en LDAP, no tendrá que volver a autorizar. Esto es cierto en la dirección opuesta: si está autorizado en su nube, la cuenta personal en el sitio también estará disponible.



La implementación resultó no ser tan simple. Encontré solo una guía sobre esta API en la red: la Guía de la API de SSO de Synology, pero todo se hace en el lado del cliente a través de ajax y, por alguna razón, no se detectó que el usuario estaba autorizado, y también funcionó muuuy lento. Por lo tanto, tuve que encontrar mi propia solución, pero resultó ser mucho más corta y sencilla.



Me alegraría que le fuera útil a otra persona.



All Articles