HTTP Basic Auth на сервере Twisted-Klein

Я использую Twisted-Klein в качестве сервера. Вот простой пример:

from klein import Klein


app = Klein()


@app.route('/health', methods=['GET'])
def health_check(request):
    return ''


@app.route('/query/<path:expression>', methods=['GET'])
def query(request, expression):
    return 'Expression: {0}'.format(expression)


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000)

Как добавить базовую аутентификацию HTTP в конечную точку query API? С Flask это просто: http://flask.pocoo.org/snippets/8/

Но я не могу найти примеры того, как это сделать на сервере Twisted-Klein.


person Marko Paunovic    schedule 10.02.2017    source источник


Ответы (1)


Сам Twisted имеет поддержку базового HTTP (и дайджест ) аутентификация, рассматриваемая как оболочка ресурса, которую можно применить к любому другому ресурсу.

Ваш пример Кляйна этого не демонстрирует, но Кляйн может (на самом деле должен) создайте ресурс из своего приложения, чтобы использовать веб-сервер Twisted.

Вы можете комбинировать их примерно так:

import attr
from zope.interface import implementer
from twisted.cred.portal import IRealm
from twisted.internet.defer import succeed
from twisted.cred.portal import Portal
from twisted.web.resource import IResource
from twisted.web.guard import HTTPAuthSessionWrapper, BasicCredentialFactory
from klein import Klein

app = Klein()
# ... define your klein app

@implementer(IRealm)
@attr.s
class TrivialRealm(object):
    resource = attr.ib()

    def requestAvatar(self, avatarId, mind, *interfaces):
        # You could have some more complicated logic here, but ...
        return succeed((IResource, self.resource, lambda: None))

def resource():
    realm = TrivialRealm(resource=app.resource())
    portal = Portal(realm, [<some credentials checkers>])
    credentialFactory = BasicCredentialFactory(b"http auth realm")
    return HTTPAuthSessionWrapper(portal, [credentialFactory])

Вы можете выполнить это в соответствии с документами klein по использованию twistd web. .

person Jean-Paul Calderone    schedule 10.02.2017
comment
Спасибо! Я постараюсь реализовать это завтра. - person Marko Paunovic; 10.02.2017
comment
Когда я пытаюсь запустить сервер с twistd, я получаю следующую ошибку: no module named 'application'. Нужно ли создавать файл setup.py и как? Может быть, будет лучше, если я открою еще один ТАК вопрос об этом. - person Marko Paunovic; 13.02.2017
comment
Какую командную строку Twistd вы использовали? Ошибка о приложении звучит так, как будто вы пытаетесь использовать его функцию WSGI, но документы klein, на которые я ссылался, предлагают параметр --class, а не WSGI. - person Jean-Paul Calderone; 13.02.2017
comment
Я использую twistd -n web --class=application.resource, и мой файл называется application.py - person Marko Paunovic; 13.02.2017
comment
Вы поместили каталог, содержащий application.py, в PYTHONPATH? - person Jean-Paul Calderone; 13.02.2017
comment
Я не. Это исправило это! Еще один вопрос, как я могу сделать простую аутентификацию пользователя/пароля, у меня есть пользователь/пароль, хранящийся в файле yaml, который я хотел бы использовать для http-аутентификации. Я вижу, что в примерах используется FilePasswordDB(), но не могу найти примеры того, как аутентифицировать пользователя, если у меня есть user/pass как пара простых строк? - person Marko Paunovic; 13.02.2017
comment
Я заставил это работать с FilePasswordDB(). Кроме того, могу ли я отключить аутентификацию для определенных API? - person Marko Paunovic; 13.02.2017
comment
twisted.web.guard работает, защищая целые ветви иерархии URL-адресов. Вам не нужно обертывать / хотя. Вы можете поместить его в /authenticated и сделать так, чтобы /anonymous был доступен без какой-либо аутентификации. Вы также можете явно разрешить анонимный доступ с помощью анонимной проверки и некоторой анонимной поддержки в области (где я разместил более сложную логику здесь, комментарий. Прочтите искаженные документы Cred, если вы еще этого не сделали. - person Jean-Paul Calderone; 13.02.2017