La première et la plus logique est de leur donner accès à la Synology déjà disponible.
Et puis il y avait un désir de le faire magnifiquement, non pas avec un nom d'utilisateur / mot de passe séparé, mais en utilisant ceux déjà émis plus tôt à partir du compte personnel. Une transition transparente de votre compte personnel aux services Synology est ce dont vous avez besoin.
Description et script sous la coupe.
Pour plus de travail, nous avons besoin d'un serveur LDAP et d'un serveur SSO installés.
SSO Server est l'implémentation propriétaire OAuth2.0 de Synology.
Nous configurons LDAP et créons l'utilisateur souhaité, définissons les droits d'accès aux services pour lui.
Ensuite, le script php que j'ai écrit, que nous installons sur le site, entre en service. Ce n'est pas grand et est disponible sur GitHub .
C'est simple avec lui. Téléchargez et placez sur le site dans le dossier / my.
Dans config.php, vous devez remplacer les valeurs suivantes par les vôtres:
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 - vous l'obtiendrez à l'étape suivante, lors de l'enregistrement avec SSO Server
- SSO_HOST - Adresse hôte pour accéder à Synology
- LOCAL_HOST - l'adresse du site sur lequel se trouve le script
- REDIRECT_URI - l'adresse où le script SSO_Oauth.php est disponible
Dans index.php (endroit indiqué), ajoutez une logique supplémentaire ou des redirections une fois que l'utilisateur s'est connecté avec succès.
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';
?>
Eh bien, le script de traitement des demandes lui-même:
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>
Ensuite, vous devez lier l'autorisation sur le site via le serveur SSO. Tout y est assez simple - Ouvrez SSO Server > Liste des applications > Ajouter > Entrez le nom et l'adresse URI dans le script SSO_Oauth.php. Après avoir cliqué sur "Ok", l' ID de l' application sera généré . Il doit être copié et placé dans notre config.php> APP_ID .
Ainsi, si un utilisateur est autorisé sur votre site via SSO, puis en cliquant sur un lien vers l'un des services Synology auxquels il a accès en LDAP, il n'aura pas à se ré-autoriser. C'est vrai dans le sens inverse - s'il est autorisé dans votre cloud, alors le compte personnel sur le site sera également disponible.
La mise en œuvre s'est avérée pas si simple. Je n'ai trouvé qu'un seul guide sur cette API sur le réseau - Synology SSO API Guide, mais tout est fait du côté client via ajax et pour une raison quelconque, il n'a pas été détecté que l'utilisateur était autorisé, et cela a également fonctionné tellement lentement. Par conséquent, j'ai dû trouver ma propre solution, mais elle s'est avérée beaucoup plus courte et plus simple.
Je serais heureux si cela est utile à quelqu'un d'autre.