2013-08-26 1 views
10

У меня есть флеш-приложение, которое служит в качестве REST API-сервера. Я хотел бы реализовать аутентификацию на основе токенов для бэкэнд, но для этого мне нужно получить токен пользователя. Документация Flask-Security ясно говорит о том, что для извлечения токена необходимо выполнить HTTP POST с данными аутентификации в виде данных JSON для конечной точки аутентификации. К сожалению, я не понимаю, как получить токен CSRF, необходимый для выполнения такого запроса.Flocks-Security CSRF token

Если я использую страницу входа/шаблон, прилагаемый к расширению, токен CSRF передается клиенту в скрытом поле в форме. Вопрос следующий:

Как получить токен CSRF без доступа и анализа страницы входа, например, из приложения angularJS с использованием методов $ http или мобильного приложения?

Очевидно, я мог бы избежать использования флеш-безопасности и реализовать объекты самостоятельно, но я относительно неопытен с webapps, и я чувствую, что, возможно, приближаюсь к этому неправильно.

+0

Как вы это сделали в конце? – kyrre

+0

Я в конечном итоге реализовал слой безопасности. Извините, у меня нет лучшего ответа для вас. – Jacopo

+0

Обратите внимание, что нет надежного способа хранения токенов в угловых координатах, см., Например, [Здесь] (https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage/). Безопасный вариант - позволить серверу хранить токен в http-only cookie + включить защиту CSRF. Если все, что вам нужно поговорить, это angularjs, вы можете просто использовать сеанс (+ anti-CSRF). – Adversus

ответ

2

Я не проверял, что это работает, но из-за кратковременного осмотра source code, вам нужно отправить запрос GET на URL-адрес входа с типом контента, установленным на application/json. Flask-Security отвечает на этот запрос версией входа в систему JSON и включает токен. Когда у вас есть токен, вы можете отправить запрос POST.

+0

Спасибо, что поставили на правильную дорогу. В дополнение к выполнению запроса GET я должен передать некоторые json-данные с запросом, иначе «request.json» пуст в Flask, и метод «_render_json» не запускается. К сожалению, хотя это приводит к ошибке в строке 45 источника, который вы связали, потому что форма не имеет атрибута пользователя. Но, кратко глядя на код, я думаю, что атрибут пользователя должен быть установлен во время проверки, но этого не происходит. Я должен буду рыть. Еще раз спасибо – Jacopo

+0

OK Я понял ошибку. Сначала проверяется метод validate_on_submit Flask-WTF для 'is_submitted', который является ложным для запроса GET. Это предотвращает вызов метода «validate» и атрибут «user» в форме от назначения. Однако вызов метода validate вручную приводит к ошибке «CSRF token missing», и мы вернемся к началу. – Jacopo

4

У меня был подобный случай использования и закончил ее решение, следуя этот пример из документации Колбы-ВТФ: https://flask-wtf.readthedocs.org/en/latest/csrf.html#ajax

Итак, CSRF Защиты приложения с помощью CsrfProtect(app), то csrf_token() становится доступным во всех шаблонах. Тогда вы можете легко сделать его доступным с помощью тега сценария:

<script type="text/javascript"> 
    var csrftoken = "{{ csrf_token() }}" 
</script> 

Теперь добавьте маркер ваших почтовых данных для Колба-Security/входа конечной точки.

+2

Спасибо за ответ, но я закончил реализацию своего собственного решения для управления пользователями. Также это работает только в том случае, если вы обслуживаете страницы с помощью приложения Flask и вы создаете шаблон с помощью Jinja. В случае, если вы используете приложение Flask только для бэкэнд (REST API), а интерфейс используется с другими методами, вам нужно будет предоставить конечную точку API для извлечения маркера и рендеринга в ответ json. Я не уверен, как это сработает, я могу попробовать. – Jacopo

0

[Запись в качестве ответа, так как я не хватает репутации комментировать]

я столкнулся с точно такой же проблемой, как Якопо, в том, что - request.json пуст, и, таким образом, get_auth_token() не срабатывает ,

BTW - Flask Security documentation говорит: аутентификация на основе

Токена включена путем извлечения маркеров Идент.польза путем выполнения POST HTTP с подробной информацией аутентификации, как данные в формате JSON от конечной точки аутентификации.

Так что я попытался POST, а не GET (по-прежнему та же проблема пустого request.json) Я позвонил/Войти с JSon данными, как:

{"email": "[email protected]", "password": "test123"} 

и направил запрос с использованием Почтальон клиента в Google Chrome ,

Но request.json пуста :(

Edit:. Я был в состоянии двигаться вперед, используя модуль запроса питона Подробнее here

+0

Привет Мандар, надеюсь, вы решили это, но я только что опубликовал ответ, который может помочь: http://stackoverflow.com/a/27926284/992509 – SJoshi

+1

ответ, который вы даете в своем блоге для начала (как реализовать токен csrf при использовании json login на флай-безопасности) по существу: отключить аутентификацию csrf в конфигурации флай-безопасности. Это экономить? В соответствии с этой статьей (https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/) до тех пор, пока вы не используете файлы cookie: " CSRF: поскольку вы не полагаетесь на файлы cookie, вам не нужно защищать от запросов на межсайтовый сайт ... »Но действительно ли это так же полезно, как использовать токены csrf? – Sebastian

1

Я боролся с этой проблемой в течение нескольких часов вчера вечером.Вот что в конечном итоге работает для меня:

Когда я создаю мое приложение экземпляра:

app = Flask(__name__) 
app.config.from_object(config_by_name[config_name]) 

# Create database connection object 
app.db = db 
app.db.init_app(app) 

CsrfProtect(app) 

В моей/входа в HTML:

<meta name="csrf-token" content="{{ csrf_token() }}"> 

От Почтальон:

enter image description here

Здесь была альтернатива, которую я пробовал, и, может быть, это будет более успешным? Это в основном тот же ответ, что пример колбовой безопасности приложения дают:

enter image description here

2

Ну, есть простой способ. Visit. Элементу конфигурации WTF_CSRF_ENABLED может быть установлено значение False, чтобы отключить csrf. Тогда все идет так, как вы пожелаете.

+1

Это решило мою проблему, спасибо. Вероятно, он был отключен, поскольку отключает функцию безопасности. Но если сервер REST выполняет аутентификацию только токена, а не проверку подлинности на основе файлов cookie, токены CSRF являются избыточными. (Я приветствую все замечания по этому поводу!) – velotron