Skip to content

Бэкэнд для авторизации пользователей

Пользователи (абоненты) должны быть предварительно настроены в соответствии со структурой 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