2014-12-08 20 views
8

Tôi hiện đang tìm cách bảo mật API REST bằng cách sử dụng xác thực dựa trên mã thông báo. Tôi đang phát triển API trong Python bằng cách sử dụng Flask và đã phát hiện ra phần mở rộng an ninh bình có vẻ có nhiều tính năng thú vị.Xác thực dựa trên mã thông báo với phần mở rộng bảo mật của bình

Một trong các tính năng được đề cập trong tài liệu là Xác thực mã thông báo.

Theo tài liệu:

Mã xác thực dựa được kích hoạt bằng cách lấy các người dùng auth thẻ bằng cách thực hiện một HTTP POST với các chi tiết xác thực như dữ liệu JSON so với endpoint xác thực. Cuộc gọi thành công tới điểm cuối này sẽ trả lại ID của người dùng và mã xác thực của họ. Mã thông báo này có thể được sử dụng trong các yêu cầu tiếp theo để bảo vệ tài nguyên .

Tuy nhiên, tôi vẫn còn chút nhầm lẫn về cách triển khai tính năng này bằng cách sử dụng bảo mật bình. Một số nghiên cứu trực tuyến đã khiến tôi sử dụng những thứ như @auth_token_required nhưng tôi gặp một số rắc rối khi kết hợp mọi thứ lại với nhau. Bản thân tài liệu bảo mật không phải là rất hữu ích.

Ví dụ: cách người dùng có thể nhận mã thông báo xác thực? các điểm cuối xác thực là gì?

Sẽ thật tuyệt nếu bạn có thể dẫn tôi đi đúng hướng. Mã số ví dụ sẽ là tuyệt vời quá :-)

+3

Tôi lo lắng rằng cơ sở hạ tầng quan trọng như vậy không được ghi chép đầy đủ. –

Trả lời

2

Xác thực endpoint là/login

Nhìn vào mã của bình-an ninh here đặc biệt views.py: _render_json()

đăng nhập() gọi _render_json mà trong lần lượt gọi get_auth_token() - và trả về mã thông báo xác thực.

Vấn đề (đối với tôi) là làm cho tính năng này hoạt động. Đối với tôi request.json dường như rỗng (do đó điều này không làm việc)

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

Hy vọng rằng đây sẽ giúp bạn di chuyển về phía trước một chút.

6

Endpoint là/đăng nhập, bạn gửi thông tin của bạn như yêu cầu json cơ thể:

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

Tuy nhiên để làm việc này bạn cần phải vô hiệu hóa các thẻ CSRF trong ứng dụng bình của bạn (nhờ Mandar Vaze):

app.config['WTF_CSRF_ENABLED'] = False 

Sau đó, bạn làm mỗi yêu cầu với token trong tiêu đề HTTP:

Authentication-Token:WyI1NTE1MjhmNDMxY2Q3NTEwOTQxY2ZhYTgiLCI2Yjc4NTA4MzBlYzM0Y2NhZTdjZjIxNzlmZjhiNTA5ZSJd.B_bF8g.t1oUMxHr_fQfRUAF4aLpn2zjja0 

Hoặc như q uery chuỗi:

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

khách hàng ví dụ trong 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) 

đoạn dụ góc để có được những mã thông báo:

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

góc đoạn dụ đến thăm trang được bảo vệ:

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

Cảm ơn. Bạn có sử dụng auth mã thông báo của Flask-Security trong sản xuất không? –

+0

Hiện tại chỉ phát triển, tôi vẫn không có câu trả lời rõ ràng cho: chúng ta có cần CSRF để tăng cường bảo mật trong trường hợp này không? Xem thêm: http://stackoverflow.com/questions/18436124/flask-security-csrf-token/27920113#comment46791688_27920113 – Sebastian

+0

Vô hiệu hóa CSRF không được chấp nhận trừ khi bạn không có chế độ xem html có biểu mẫu. –

5

Tôi tìm thấy mã thông báo của Flask-Security không phải là một ứng cử viên tốt cho dự án của tôi. Thay vào đó, tôi khuyên bạn nên sử dụng mã thông báo JWT.

Sự cố với xác thực dựa trên mã thông báo của Flask-Security.

  1. Cần để vô hiệu hóa CSRF toàn cầu, điều này là không tốt khi bạn cũng có một ứng dụng web truyền thống, trong đó CSRF token là mong muốn
  2. Không có cách nào dễ dàng để làm mới token (không gửi lại mật khẩu)
  3. Can không kiểm soát tải trọng của mã thông báo, không có API để đặt/lấy dữ liệu đến/từ mã thông báo
  4. Mã thông báo đó, theo thiết kế, chỉ hoạt động với một ứng dụng Flask. Vì vậy, nếu ứng dụng front-end của bạn cần phải nói chuyện với nhiều apis yên tĩnh, làm việc tốt này wont

Check-out JWT (pyjwt hoặc flask-jwt) token, nó giải quyết tất cả những vấn đề trên và nhiều hơn nữa.

+0

Nếu bạn sử dụng wtforms, bạn không cần vô hiệu hóa CSRF trên toàn cầu, bạn có thể sử dụng trình trang trí '@ csrf_protect.exempt' trên chế độ xem API của mình. – bmjjr

Các vấn đề liên quan