Настройка внешней авторизации в Apache: различия между версиями
Bas (обсуждение | вклад) Нет описания правки |
Bas (обсуждение | вклад) |
||
Строка 15: | Строка 15: | ||
libapache2-mod-authnz-external | libapache2-mod-authnz-external | ||
#!/usr/bin/php -q | |||
<?php | |||
namespace OCP; | |||
require '/opt/www/owncloud/lib/base.php'; | |||
require '/opt/www/owncloud/lib/public/user.php'; | |||
$uid = trim(fgets(STDIN)); | |||
$password = trim(fgets(STDIN)); | |||
$oc_user = new User(); | |||
$retval = $oc_user->checkPassword($uid, $password); | |||
if ($retval == $uid) | |||
{ | |||
exit(0); | |||
} | |||
else | |||
{ | |||
exit(1); | |||
} | |||
?> | |||
<Files "public.php"> | |||
<------><------>AuthType Basic | |||
<------><------>AuthName "Enter Login and Password for download" | |||
<------><------>AuthBasicProvider external | |||
<------><------>Require valid-user | |||
<------><------>AuthExternal oc_check_pass | |||
<------></Files> | |||
<------>AddExternalAuth oc_check_pass /etc/apache2/oc_check_pass.php | |||
<------>SetExternalAuthMethod oc_check_pass pipe | |||
[[Category:Apache]] | [[Category:Apache]] | ||
[[Category:Debian]] | [[Category:Debian]] |
Версия от 14:11, 23 октября 2014
Вступление
Есть один проект, который использует облачное файловое хранилище OwnCloud. Для того, чтобы пользователь мог загружать данные ему обязательно необходима учётная запись. С этим пунктом проблем не возникло. В функционале OwnCloud'а есть опции предоставления доступа между пользователями системы и предоставление доступа по уникальной ссылке. Если с доступом по логину или группе проблем с безопасностью нет, то доступ по ссылке предполагает то, что ссылка доступна всем желающим и входить в систему для этого не требуется. Вот тут и возникла проблема: хотелось сохранить функционал ссылок, но доступ предоставлять только по логину и паролю.
Анализ
Доступ к файлам по ссылке имеет следующий вид: https://owncloud.gwtools.ru/public.php?service=files&t=5627da44883053d541add981dbfea754
. Было решено, что с помощью web-сервера Apache мы будем ограничивать доступ к файлу public.php
.
Логично, что пользователи должны были вводить тот же логин и пароль, который им необходим для входа в OwnCloud. Решение в лоб: создать такой файл :) Тут сразу появилось куча "пунктиков".
Во-первых, при создании пользователя в OwnCloud'е его необходимо добавлять в файл. Если бы это был всего 1 или 2 пользователя, то я бы это пережил, но что делать, если надо будет добавлять 10, 20, 50? Те же самые проблемы возникают и с удалением пользователей.
Во-вторых, пользователь мог менять свой пароль. Да, есть в нашем мире люди, которые меняют пароли, присланные им по почте. Возникает проблема синхронизации паролей между файлом и базой данных.
В-третьих, пароль в OwnCloud'е хранится в зашифрованном виде, с солью, своими какими-то смещениями. Не плохо, но вариант с экспортом пользователей в обычный файл с Basic
авторизацией не подходил.
Решение
libapache2-mod-authnz-external
- !/usr/bin/php -q
<?php
namespace OCP;
require '/opt/www/owncloud/lib/base.php'; require '/opt/www/owncloud/lib/public/user.php';
$uid = trim(fgets(STDIN)); $password = trim(fgets(STDIN));
$oc_user = new User(); $retval = $oc_user->checkPassword($uid, $password);
if ($retval == $uid) {
exit(0);
} else {
exit(1);
}
?>
<Files "public.php"> <------><------>AuthType Basic <------><------>AuthName "Enter Login and Password for download" <------><------>AuthBasicProvider external <------><------>Require valid-user <------><------>AuthExternal oc_check_pass <------></Files>
<------>AddExternalAuth oc_check_pass /etc/apache2/oc_check_pass.php <------>SetExternalAuthMethod oc_check_pass pipe