O primeiro e mais lógico é dar-lhes acesso ao Synology já disponível.
E então surgiu o desejo de fazer isso lindamente, não com um nome de usuário / senha separado, mas usando aqueles já emitidos anteriormente da conta pessoal. Uma transição perfeita de sua conta pessoal para os serviços da Synology é o que você precisa.
Descrição e roteiro sob o corte.
Para trabalhos futuros, precisamos de um servidor LDAP e um servidor SSO instalados.
O Servidor SSO é uma implementação OAuth2.0 de propriedade da Synology.
Nós configuramos o LDAP e criamos o usuário desejado, definimos direitos de acesso aos serviços para ele.
Em seguida, o script php que escrevi, que instalamos no site, entra em operação. Não é grande e está disponível no GitHub .
É simples com ele. Baixe e coloque no site na pasta / my.
Em config.php, você precisa substituir os seguintes valores pelos seus:
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 - você o obterá na próxima etapa, ao se registrar no Servidor SSO
- SSO_HOST - Endereço do host para acessar Synology
- LOCAL_HOST - o endereço do site em que o script está localizado
- REDIRECT_URI - o endereço onde o script SSO_Oauth.php está disponível
Em index.php (local marcado), adicione mais lógica ou redirecionamentos depois que o usuário efetuar login com sucesso
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';
?>
Bem, o próprio script de processamento da solicitação:
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>
Em seguida, você precisa vincular a autorização no site por meio do servidor SSO. Tudo é bastante simples nele - Abra Servidor SSO > Lista de aplicativos > Adicionar > Digite o nome e o endereço URI para o script SSO_Oauth.php. Após clicar em "Ok", será gerado o ID do aplicativo . Ele precisa ser copiado e colocado em nosso config.php> APP_ID .
Assim, se um usuário for autorizado em seu site por meio de SSO, clicando em um link para qualquer um dos serviços Synology aos quais ele tem acesso no LDAP, ele não terá que autorizar novamente. Isso é verdade na direção oposta - se ele for autorizado na sua nuvem, a conta pessoal no site também estará disponível.
A implementação acabou não sendo tão simples. Encontrei apenas um guia sobre esta API na rede - Synology SSO API Guide, mas tudo é feito no lado do cliente via ajax e por algum motivo não foi detectado que o usuário estava autorizado, e também funcionou muuuito devagar. Portanto, tive que encontrar minha própria solução, mas acabou sendo muito mais curta e simples.
Eu ficaria feliz se fosse útil para outra pessoa.