Документация на Flussonic Watcher

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

Схема работы

  • Оператор реализует обработчик http-запросов, в котором делает необходимую ему логику по аутентификации абонентов (пример в комментарии ниже).
  • Оператор указывает в настройках Flussonic Watcher http url к аутентификационному бекенду (settings/authentication backend).
  • Абонент логинится в Flussonic Watcher (отправляет логин/пароль со страницы).
  • Flussonic Watcher передает их бекенду оператора в параметрах запроса.
  • Бекенд на основе собственных данных принимает решение о том пускать абонента или нет.
  • В случае, когда абоненту разрешен вход, бекенд возвращает http код 200.
  • В противном случае, бекенд возвращает http код 403.
  • Если абонент не был найден, ожидается код 404.
  • Вместе с разрешением на вход, бекенд может вернуть в теле ответа json с указанием актуальных групп этого абонента.
  • Получив ответ, Flussonic Watcher актуализирует информацию о пользователе в собственной базе.
  • При полученном разрешении обновляется хеш пароля абонента и список групп, в которые этот абонент входит.
  • При отказе пароль абонента в Flussonic Watcher аннулируется.
  • В случае, если аутентификационный бекенд был недоступен или не успел ответить за 2 секунды, проверка абонента происходит по внутренней базе Flussonic 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':
            resp.body = json.dumps(dict(groups=['a', 'b']))
            return
          resp.status = falcon.HTTP_403
          return
    
        resp.status = falcon.HTTP_404
    
    app = falcon.API()
    ad = AuthResource()
    
    app.add_route('/auth', ad)
    

    Примеры запросов Anchor Anchor x2

    Абонента пускаем, ему доступны группы a и b:

    curl -vvv http://localhost:8001/auth\?login\=user1\&password\=letmein
    
    *   Trying 127.0.0.1...
    * Connected to localhost (127.0.0.1) port 8001 (#0)
    > GET /auth?login=user1&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:12 GMT
    < Connection: close
    < content-length: 22
    < content-type: application/json; charset=UTF-8
    <
    * Closing connection 0
    {"groups": ["a", "b"]}
    

    Абонента пускаем, групп нет:

    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