2014-12-08 2 views
8

현재 토큰 기반 인증을 사용하여 REST API를 보호하는 방법을 찾고 있습니다. 저는 Flask를 사용하여 Python으로 API를 개발하고 있으며 많은 흥미로운 기능을 가진 것으로 보이는 플라스크 보안 확장을 발견했습니다.플라스크 보안 확장 기능이있는 토큰 기반 인증

설명서에서 언급 된 기능 중 하나는 토큰 인증입니다. 설명서에 따르면

:

토큰 기반 인증은 인증 포인트에 대해 JSON 데이터로서 인증 세부는 HTTP POST를 수행하여 사용자 인증 토큰을 검색하여 사용할 수있다. 호를 성공적으로 호출하면 사용자 ID와 해당 인증 토큰이 리턴됩니다. 이 토큰은 보호 된 자원에 대한 후속 요청에서 사용될 수 있습니다.

그러나 플라스크 보안을 사용하여이 기능을 구현하는 방법에 대해서는 여전히 혼란 스럽습니다. 일부 온라인 조사를 통해 @auth_token_required 같은 것을 사용하게되었지만 모든 것을 하나로 묶는 데 어려움을 겪고 있습니다. 플라스크 보안 문서 자체는별로 도움이되지 않습니다.

예를 들어, 사용자가 인증 토큰을 얻는 방법은 무엇입니까? 인증 엔드 포인트는 무엇입니까?

나를 올바른 방향으로 이끌 수 있다면 좋을 것입니다. 코드 예제 좋지 않을까 너무 :-)

+3

중요한 인프라 스트럭처가 잘 문서화되어 있지 않은지 걱정됩니다. –

답변

2

인증 엔드 포인트는/

플라스크 보안 here의 코드를 보면 특별히 views.py의 로그인입니다 : _render_json()

로그인을() _render_json를 호출하는 get_auth_token()을 호출하고 인증 토큰을 반환합니다.

문제는 (나를 위해)이 문제를 해결하는 것입니다. 나를 위해 는 request.json

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

는 희망이 당신이 앞으로 약간 이동하는 데 도움이 (따라서이 하지 작업을 수행) 빈 것 같다.

: 당신이 당신의 플라스크 응용 프로그램 (감사 만다 Vaze)에서 CSRF 토큰을 사용하지 않도록해야 할 일이위한 그러나

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

:

6

엔드 포인트

는/로그인, 당신은 JSON 요청 본문으로 자격 증명을 게시 할 것입니다

Authentication-Token:WyI1NTE1MjhmNDMxY2Q3NTEwOTQxY2ZhYTgiLCI2Yjc4NTA4MzBlYzM0Y2NhZTdjZjIxNzlmZjhiNTA5ZSJd.B_bF8g.t1oUMxHr_fQfRUAF4aLpn2zjja0 

또는 q로 : 그런 다음

app.config['WTF_CSRF_ENABLED'] = False 

당신은 HTTP 헤더의 토큰을 각 요청을 uery 문자열 :

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

클라이언트 예를 파이썬 3 : 보호 된 페이지를 방문

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

각도 예를 조각 :

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) 

각도 예 조각은 토큰을 구하는

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

양식에 HTML 뷰가 없으면 CSRF를 비활성화 할 수 없습니다. –

5

Flask-Security의 토큰 기반 프로젝트가 좋은 프로젝트가 아닙니다. 대신 JWT 토큰을 사용하는 것이 좋습니다.

Flask-Security의 토큰 기반 인증의 문제점. 당신은 또한 CSRF 토큰이 바람직하다있는 기존의 웹 응용 프로그램이있을 때 전 세계적으로 CSRF를 해제하는

  1. 필요성이 좋지 않아
  2. (다시 비밀번호를 제출하지 않고) 토큰을 갱신하는 쉬운 방법
  3. 수 토큰의 페이로드를 제어하지 않고 토큰간에 데이터를주고받을 API가 없습니다.
  4. 토큰은 설계 상 하나의 Flask 앱에서만 작동합니다. 그렇다면 귀하의 프론트 엔드 응용 프로그램이 실 거예요 작업도에게 여러 편안한 API와 이야기 토큰

체크 아웃 JWT (pyjwt 또는 flask-jwt)가 필요 그것은 위의 모든 문제 등을 해결합니다.

+0

wtforms를 사용하는 경우 CSRF를 전역 적으로 비활성화 할 필요는 없습니다. API 뷰에서'@ csrf_protect.exempt' 데코레이터를 사용할 수 있습니다. – bmjjr