17

現在、トークン ベースの認証を使用して REST API を保護する方法を探しています。私は Flask を使用して Python で API を開発しており、多くの興味深い機能を備えているように見えるフラスコセキュリティ拡張機能を発見しました。

ドキュメントに記載されている機能の 1 つは、トークン認証です。

ドキュメントによると:

トークン ベースの認証は、認証エンドポイントに対して認証の詳細を JSON データとして HTTP POST を実行してユーザー認証トークンを取得することで有効になります。このエンドポイントへの呼び出しが成功すると、ユーザーの ID とその認証トークンが返されます。このトークンは、保護されたリソースへの後続のリクエストで使用できます。

ただし、flask-security を使用してこの機能を実装する方法については、まだ少し混乱しています。いくつかのオンライン調査により、@auth_token_required などを使用するようになりましたが、すべてをまとめるのに苦労しています。フラスコセキュリティのドキュメント自体はあまり役に立ちません。

たとえば、ユーザーはどのようにして認証トークンを取得できますか? 認証エンドポイントとは何ですか?

あなたが私を正しい方向に導くことができれば、それは素晴らしいことです。コード例も素晴らしいでしょう:-)

4

3 に答える 3

20

エンドポイントは /login です。資格情報を json リクエスト ボディとして投稿します。

{'email':'john@smit.com', 'password':'1234'}

ただし、これを機能させるには、flask アプリで csrf トークンを無効にする必要があります (Mandar Vaze に感謝します)。

app.config['WTF_CSRF_ENABLED'] = False

次に、HTTP ヘッダーのトークンを使用して各リクエストを実行します。

Authentication-Token:WyI1NTE1MjhmNDMxY2Q3NTEwOTQxY2ZhYTgiLCI2Yjc4NTA4MzBlYzM0Y2NhZTdjZjIxNzlmZjhiNTA5ZSJd.B_bF8g.t1oUMxHr_fQfRUAF4aLpn2zjja0

またはクエリ文字列として:

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

Python 3 でのクライアントの例:

import requests
import json

#do the login
r = requests.post('http://localhost:5000/login', 
                    data=json.dumps({'email':'john@smit.com', '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 の例のスニペット:

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

保護されたページにアクセスするための Angular サンプル スニペット:

 if ($window.sessionStorage.getItem('token')) {
                config.headers['Authentication-Token'] = $window.sessionStorage.getItem('token');
            }
于 2015-03-27T15:12:54.250 に答える
11

Flask-Security のトークンベースは、私のプロジェクトには適していません。代わりに JWT トークンを使用することをお勧めします。

Flask-Security のトークン ベースの認証に関する問題。

  1. CSRF をグローバルに無効にする必要があります。CSRF トークンが望ましい従来の Web アプリケーションもある場合、これは適切ではありません。
  2. トークンを更新する簡単な方法はありません (パスワードを再度送信する必要はありません)
  3. トークンのペイロードを制御できません。トークンとの間でデータをやり取りするための API がありません
  4. そのトークンは、設計上、1 つの Flask アプリでのみ機能します。したがって、フロントエンド アプリが複数の安らかな API と通信する必要がある場合、これはうまく機能しません。

JWT ( pyjwtまたはフラスコ jwt ) トークンをチェックしてください。上記の問題をすべて解決します。

于 2016-07-21T00:15:47.093 に答える
2

認証エンドポイントは /login

ここでフラスコセキュリティのコードを見てください。具体的には、views.py: _render_json()

login() は _render_json を呼び出し、次に get_auth_token() を呼び出し、認証トークンを返します。

(私にとって)問題は、これを機能させることです。私にとって request.json は空のようです(したがって、これは機能しませ

{"email": "test@example.com", "password": "test123"}

うまくいけば、これはあなたが少し前進するのに役立ちます.

于 2015-01-13T10:49:41.740 に答える