Synology SSO Server - Verwalten Sie Autorisierungs- und Zugriffsdienste von der Site aus

Vor einiger Zeit stand ich vor der Aufgabe, zum Schutz der Geschäftsgeheimnisse meiner Kunden die Nutzung von Cloud-Diensten von Drittanbietern zu verweigern.



Die erste und logischste Sache ist, ihnen Zugriff auf die bereits verfügbare Synology zu gewähren.



Und dann gab es den Wunsch, es wunderbar zu machen, nicht mit einem separaten Benutzernamen / Passwort, sondern mit denen, die bereits zuvor vom persönlichen Konto ausgegeben wurden. Sie benötigen einen nahtlosen Übergang von Ihrem persönlichen Konto zu Synology Services.



Beschreibung und Skript unter dem Schnitt.



Für die weitere Arbeit benötigen wir einen installierten LDAP-Server und einen SSO-Server.

SSO Server ist die proprietäre OAuth2.0-Implementierung von Synology.



Wir konfigurieren LDAP und erstellen den gewünschten Benutzer, legen für ihn Zugriffsrechte auf Dienste fest.



Dann kommt das von mir geschriebene PHP-Skript, das wir auf der Site installieren, in Betrieb. Es ist nicht groß und auf GitHub verfügbar .



Bei ihm ist es einfach. Laden Sie es herunter und platzieren Sie es auf der Site im Ordner / my.



In config.php müssen Sie die folgenden Werte durch Ihre eigenen ersetzen:



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 - Sie erhalten es im nächsten Schritt, wenn Sie sich bei SSO Server registrieren
  • SSO_HOST - Hostadresse für den Zugriff auf Synology
  • LOCAL_HOST - Die Adresse der Site, auf der sich das Skript befindet
  • REDIRECT_URI - Die Adresse, unter der das Skript SSO_Oauth.php verfügbar ist


Fügen Sie in index.php (Ort markiert) weitere Logik oder Weiterleitungen hinzu, nachdem der Benutzer erfolgreich angemeldet wurde.



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

?>




Nun, das Anforderungsverarbeitungsskript selbst:



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>





Als Nächstes müssen Sie die Autorisierung auf der Site über den SSO-Server binden. Alles ist ganz einfach: Öffnen Sie SSO Server > Anwendungsliste > Hinzufügen > Geben Sie den Namen und die URI-Adresse in das Skript SSO_Oauth.php ein. Nach dem Klicken auf "Ok" wird die Anwendungs-ID generiert . Es muss kopiert und in unserer config.php> APP_ID abgelegt werden .



Wenn ein Benutzer auf Ihrer Site über SSO autorisiert ist und auf einen Link zu einem der Synology-Dienste klickt, auf die er in LDAP Zugriff hat, muss er keine erneute Autorisierung vornehmen. Dies gilt in umgekehrter Richtung. Wenn er in Ihrer Cloud autorisiert ist, ist auch das persönliche Konto auf der Website verfügbar.



Die Implementierung erwies sich als nicht so einfach. Ich habe nur eine Anleitung zu dieser API im Netzwerk gefunden - Synology SSO API Guide, aber alles wird auf der Clientseite über Ajax erledigt und aus irgendeinem Grund wurde nicht erkannt, dass der Benutzer autorisiert war, und es hat auch sooo langsam funktioniert. Daher musste ich meine eigene Lösung finden, die sich jedoch als viel kürzer und einfacher herausstellte.



Ich würde mich freuen, wenn es jemand anderem nützlich ist.



All Articles