2014-12-08 1 views
8

В настоящее время я ищу способ защитить REST API, используя аутентификацию на основе токенов. Я разрабатываю API в Python, используя Flask, и обнаружил расширение для флай-безопасности, которое, похоже, обладает множеством интересных функций.Аутентификация на основе токена с расширением флэш-памяти

Одной из особенностей, упомянутых в документации, является аутентификация Token.

Согласно документации: аутентификация на основе

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

Тем не менее, я все еще немного смущен тем, как реализовать эту функцию, используя фляж-безопасность. Некоторые онлайн-исследования привели меня к использованию таких вещей, как @auth_token_required, но у меня возникают проблемы с тем, чтобы собрать все вместе. Сама документация с флаконами не очень полезна.

Например, как пользователь может получить токен аутентификации? каковы конечные точки аутентификации?

Было бы здорово, если бы вы смогли привести меня в правильном направлении. Примеры кода будет удивительным тоже :-)

+3

Меня беспокоит, что такая критическая инфраструктура плохо документирована. –

ответ

2

Аутентификация конечная точка/Логин

Посмотрите на код колба-безопасности here специально views.py: _render_json()

Логин() вызывает _render_json, которые в превратить вызовы get_auth_token() - и возвращает токен auth.

Проблема (для меня) заключается в том, чтобы заставить это работать. Для меня request.json кажется пустым (следовательно, это делает не работы)

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

Надеюсь, это поможет вам двигаться вперед немного.

6

конечной точки является/Логин, вы размещаете свои полномочия в качестве запроса JSON тела:

{'email':'[email protected]', 'password':'1234'} 

Однако для этого, чтобы работать, вы должны отключить CSRF токены в флягу приложения (спасибо Mandar Vaze):

app.config['WTF_CSRF_ENABLED'] = False 

Затем вы делаете каждый запрос с маркером в заголовках HTTP:

Authentication-Token:WyI1NTE1MjhmNDMxY2Q3NTEwOTQxY2ZhYTgiLCI2Yjc4NTA4MzBlYzM0Y2NhZTdjZjIxNzlmZjhiNTA5ZSJd.B_bF8g.t1oUMxHr_fQfRUAF4aLpn2zjja0 

Или как д uery строка: Пример

http://localhost:5000/protected?auth_token=WyI1NTE1MjhmNDMxY2Q3NTEwOTQxY2ZhYTgiLCI2Yjc4NTA4MzBlYzM0Y2NhZTdjZjIxNzlmZjhiNTA5ZSJd.B_bF8g.t1oUMxHr_fQfRUAF4aLpn2zjja0 

Client в Python 3:

import requests 
import json 

#do the login 
r = requests.post('http://localhost:5000/login', 
        data=json.dumps({'email':'[email protected]', 'password':'1234'}), 
        headers={'content-type': 'application/json'}) 
response = r.json() 
print(response) #check response 
token = response['response']['user']['authentication_token'] #set token value 

#Now you can do authorised calls 
r = requests.get('http://localhost:5000/protected', 
       headers={'Authentication-Token': token}) 
print(r.text) 

угловыми пример фрагмента кода, чтобы получить маркер:

$http.post('/login', {"email": $scope.formdata.login,"password":$scope.formdata.password}). 
      success(function(results) { 
      $window.sessionStorage.token = results.response.user.authentication_token; 
      }); 

Угловой пример фрагмент кода для посещения защищенных страниц:

if ($window.sessionStorage.getItem('token')) { 
       config.headers['Authentication-Token'] = $window.sessionStorage.getItem('token'); 
      } 
+0

Спасибо. Используете ли вы токены на основе токенов Flask-Security? –

+0

В настоящее время только по разработке, у меня до сих пор нет определенного ответа: нужен ли нам CSRF для повышения безопасности в этом случае? См. Также: http://stackoverflow.com/questions/18436124/flask-security-csrf-token/27920113#comment46791688_27920113 – Sebastian

+0

Отключение CSRF неприемлемо, если у вас нет html-представлений с формами. –

5

Я нашел маркер Flask-Security не очень хорошим кандидатом для моего проекта. Вместо этого я рекомендую использовать токен JWT.

Проблемы с аутентификацией на токене Flask-Security.

  1. необходимо отключить CSRF глобально, это не хорошо, когда у вас также есть традиционные веб-приложение, в котором CSRF токен желательно
  2. Нет простой способ обновить маркер (без повторной отправки пароля)
  3. Может не контролировать полезную нагрузку токена, нет API для ввода/получения данных в токен
  4. Этот токен, по дизайну, работает только с одним флеш-приложением. Так что, если ваш интерфейс приложения нужно поговорить с несколькими успокоительных APIs, эта привычка хорошо работать

ЗАКАНЧИВАТЬ JWT (pyjwt или flask-jwt) лексемы, он решает все вышеуказанные проблемы и многое другое.

+0

Если вы используете wtforms, вам не нужно отключать CSRF глобально, вы можете использовать декоратор '@ csrf_protect.exempt' в своих представлениях API. – bmjjr

Смежные вопросы