Бэкэнд для авторизации пользователей¶
Пользователи (абоненты) должны быть предварительно настроены в соответствии со структурой Watcher.
Схема работы
- Оператор связи реализует обработчик http-запросов, в котором делает необходимую ему логику по аутентификации абонентов (пример см. ниже).
- Оператор связи указывает в настройках Flussonic Watcher http url к аутентификационному бекенду (Настройки - Внешняя аутентификация).
- Абонент входит в Flussonic Watcher (отправляет логин/пароль со страницы).
- Flussonic Watcher передает их бекенду в параметрах запроса.
-
Бекенд на основе собственных данных принимает решение, о том пускать абонента или нет:
- В случае, когда абоненту разрешен вход, бекенд возвращает http код 200.
- В противном случае, бекенд возвращает http код 403.
- Если абонент не был найден, ожидается код 404.
-
В случае, если аутентификационный бекенд был недоступен или не успел ответить за 2 секунды, проверка абонента происходит по внутренней базе Flussonic Watcher.
Note
Если пароли абонента в БД бекенда и БД Flussonic отличаются, то при успешной авторизации через бэкэнд кеш пароля в БД Flussonic будет заменен на кэш пароля бекенда. Таким образом, абонент сможет получать доступ к системе с единым паролем, даже если бекенд будет недоступен.
Однако смена пароля абонента из интерфейса Watcher при этом не предусмотрена. Если абонент поменяет пароль в Watcher, то не сможет войти в систему с новым паролем, а при следующей успешной авторизации новый пароль будет заменен на пароль бекенда.
import falcon, json
class AuthResource:
def on_get(self, req, resp):
print "GET %r\n%r" % (req.uri, req.params)
login = req.params.get('login', None)
password = req.params.get('password', None)
if not login or not password:
print 'incorrect request login: %r, pass: %r' % (login, password)
resp.status = falcon.HTTP_400
return
if login == 'user0':
if password == 'letmein':
return
resp.status = falcon.HTTP_403
return
if login == 'user1':
if password == 'letmein':
return
resp.status = falcon.HTTP_403
return
resp.status = falcon.HTTP_404
app = falcon.API()
ad = AuthResource()
app.add_route('/auth', ad)
Примеры запросов¶
Абонента пускаем:
curl -vvv http://localhost:8001/auth\?login\=user0\&password\=letmein
* Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 8001 (#0)
> GET /auth?login=user0&password=letmein HTTP/1.1
> Host: localhost:8001
> User-Agent: curl/7.47.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: gunicorn/19.7.0
< Date: Mon, 20 Mar 2017 10:16:21 GMT
< Connection: close
< content-length: 0
< content-type: application/json; charset=UTF-8
<
* Closing connection 0
Абонента не пускаем:
curl -vvv http://localhost:8001/auth\?login\=user0\&password\=wrong
* Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 8001 (#0)
> GET /auth?login=user0&password=wrong HTTP/1.1
> Host: localhost:8001
> User-Agent: curl/7.47.0
> Accept: */*
>
< HTTP/1.1 403 Forbidden
< Server: gunicorn/19.7.0
< Date: Mon, 20 Mar 2017 10:16:27 GMT
< Connection: close
< content-length: 0
< content-type: application/json; charset=UTF-8
<
* Closing connection 0
Абонент не найден:
curl -vvv http://localhost:8001/auth\?login\=user10\&password\=wrong
* Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 8001 (#0)
> GET /auth?login=user10&password=wrong HTTP/1.1
> Host: localhost:8001
> User-Agent: curl/7.47.0
> Accept: */*
>
< HTTP/1.1 404 Not Found
< Server: gunicorn/19.7.0
< Date: Mon, 20 Mar 2017 10:20:04 GMT
< Connection: close
< content-length: 0
< content-type: application/json; charset=UTF-8
<
* Closing connection 0