2014-12-08 7 views
8

Ich bin derzeit auf der Suche nach einer Möglichkeit, eine REST-API mit Token-basierte Authentifizierung zu sichern. Ich entwickle die API in Python mit Flask und habe die Flasch-Security-Erweiterung entdeckt, die viele interessante Features zu haben scheint.Token-basierte Authentifizierung mit Kolben-Sicherheitserweiterung

Eines der in der Dokumentation erwähnten Features ist die Token-Authentifizierung.

Nach der Dokumentation:

Token basierende Authentifizierung aktiviert ist, indem der Benutzer auth Token Abrufen durch einen HTTP-POST mit dem Authentifizierungsdetail als JSON Daten vor dem Authentifizierungs-Endpunkt durchgeführt wird. Ein erfolgreicher Anruf an dieser Endpunkt wird die Benutzer-ID und ihre Authentifizierung Token zurückgeben. Dieses Token kann in nachfolgenden Anforderungen für geschützte Ressourcen verwendet werden.

Ich bin jedoch immer noch ein wenig verwirrt darüber, wie diese Funktion mit Hilfe von Flasch-Sicherheit zu implementieren. Einige Online-Forschung hat mich dazu gebracht, Dinge wie @auth_token_required zu verwenden, aber ich habe einige Schwierigkeiten, alles zusammen zu setzen. Die Flasch-Sicherheitsdokumentation selbst ist nicht sehr hilfreich.

Zum Beispiel, wie kann ein Benutzer ein Authentifizierungstoken bekommen? Was sind die Authentifizierungsendpunkte?

Es wäre schön, wenn Sie mich in die richtige Richtung führen könnten. Codebeispiele wäre genial auch :-)

+3

Es macht mir Sorgen, dass solche kritische Infrastruktur nicht gut dokumentiert ist. –

Antwort

2

Authentication Endpunkt/login

Blick auf den Code der Kolben-Sicherheit here speziell views.py: _render_json()

login() ruft _render_json die in Aufrufe abrufen get_auth_token() - und gibt das Authentifizierungs-Token zurück.

Problem (für mich) ist, dies zur Arbeit zu bringen. Für mich scheint request.json leer (daher das tut nicht Arbeit)

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

Hoffentlich hilft Ihnen ein wenig nach vorne zu bewegen.

6

Endpoint ist/login, können Sie Ihre Anmeldeinformationen als json Anfrage Körper hinterlassen:

:

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

hierfür auch immer Sie die csrf Token in Ihrem Kolben app (dank Mandar Vaze) deaktivieren, muss arbeiten

app.config['WTF_CSRF_ENABLED'] = False 

Dann tun Sie jede Anfrage mit dem Token in den HTTP-Header:

Authentication-Token:WyI1NTE1MjhmNDMxY2Q3NTEwOTQxY2ZhYTgiLCI2Yjc4NTA4MzBlYzM0Y2NhZTdjZjIxNzlmZjhiNTA5ZSJd.B_bF8g.t1oUMxHr_fQfRUAF4aLpn2zjja0 

Oder als q uery string:

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

Client-Beispiel in 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) 

Angular Beispiel Snippet das Token zu erhalten:

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

Angular Beispiel Snippet geschützten Seiten zu besuchen:

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

Danke. Verwenden Sie die tokenbasierte Authentifizierung von Flask-Security in der Produktion? –

+0

Derzeit nur auf Entwicklung, ich habe immer noch keine definitive Antwort auf: Brauchen wir CSRF, um die Sicherheit in diesem Fall zu verbessern? Siehe auch: http://stackoverflow.com/questions/18436124/flask-security-csrf-token/27920113#comment46791688_27920113 – Sebastian

+0

Das Deaktivieren von CSRF ist nicht zulässig, es sei denn, Sie haben keine HTML-Ansichten mit Formularen. –

5

Ich fand Flask-Security's Token-basierte nicht einen guten Kandidaten für mein Projekt. Ich empfehle stattdessen, JWT-Token zu verwenden.

Die Probleme mit der tokenbasierten Authentifizierung von Flask-Security.

  1. Need CSRF global zu deaktivieren, dies ist nicht gut, wenn man auch eine herkömmliche Web-Anwendung hat, in der CSRF-Token wünschenswert sind
  2. keine einfache Möglichkeit, das Token zu erneuern (ohne erneut das Passwort eingereicht)
  3. Can nicht die Nutzlast des Tokens steuern, es gibt keine API zum Abrufen/Abrufen von Daten zum Token
  4. Dieses Token funktioniert nur mit einer Flask-App. Also, wenn Ihr Frontend App muss mit mehreren erholsamen apis, dieses nicht funktionieren gut

Check out JWT (pyjwt oder flask-jwt) Token, es löst alle oben genannten Probleme und mehr sprechen.

+0

Wenn Sie wtforms verwenden, müssen Sie CSRF nicht global deaktivieren. Sie können den Dekorator '@ csrf_protect.exempt' in Ihren API-Ansichten verwenden. – bmjjr

Verwandte Themen