2011-08-28 36 views
15

Tôi hiện đang viết một API còn lại trong python với Microframework Flask. Đây là API riêng tư và giao dịch với dữ liệu người dùng. Tôi dự định sử dụng API này để xây dựng web và ứng dụng Android.Tìm kiếm lời khuyên để bảo mật API REST riêng được viết trong python-flask

Hiện tại tôi sử dụng xác thực thông báo để bảo mật dữ liệu người dùng cá nhân. Ví dụ: nếu bạn muốn đăng dữ liệu trên dịch vụ của mình với người dùng bob, bạn thực hiện yêu cầu đăng bài tại myapi/story/create và cung cấp thông tin xác thực của Bob với mẫu thông báo.

Tôi biết đây không phải là một giải pháp tốt vì:
auth -Digest không an toàn
-Các khách hàng không được chứng thực (? Làm thế nào để đảm bảo yêu cầu không liên quan với người sử dụng hiện nay, ví dụ như tạo một người dùng mới)

Tôi đã đọc rất nhiều nội dung về oAuth nhưng xác thực 3 chân có vẻ quá mức cần thiết vì tôi không có kế hoạch mở API của mình cho bên thứ ba.
OAuth 2 chân sẽ không phù hợp vì nó chỉ cung cấp xác thực cho khách hàng chứ không chỉ cho người dùng.
Một vấn đề khác với oAuth là tôi chưa tìm thấy hướng dẫn toàn diện để triển khai nó bằng Python. Tôi đã tìm thấy thư viện python-oauth2 nhưng tôi không hiểu ví dụ về máy chủ và tôi không thể tìm thấy tài liệu bổ sung. Thêm vào đó có vẻ như nhiều khía cạnh của oAuth không được đề cập trong ví dụ này.

Vì vậy, câu hỏi của tôi là:

  1. Có kế hoạch thay thế (không OAuth) cho xác thực cả khách hàng và người dùng với một mức độ hợp lý của an ninh?
  2. Nếu oAuth là giải pháp tốt nhất:
    • Làm cách nào để bỏ qua quá trình cấp phép (vì người dùng sẽ không phải ủy quyền cho khách hàng bên thứ ba)?
    • Có tài liệu hướng dẫn được giải nén cho python-oauth2 hoặc cho bất kỳ thư viện Python nào khác không?

Bất kỳ trợ giúp hoặc lời khuyên nào sẽ được đánh giá cao.

+0

Liên quan đến một trong những vấn đề của mình, một phần lớn các trang web lớn không cho phép bạn đăng ký thông qua khách hàng vv, họ làm cho bạn đăng ký thông qua trang web của họ. Đối với những trang web cho phép điều đó, cuộc gọi API của họ có hiệu quả giống như biểu mẫu đăng ký của họ, vì vậy không quan trọng nếu nó an toàn hay không. –

Trả lời

7

Câu trả lời đơn giản là để lộ API của bạn thông qua HTTPS chỉ, và sau đó sử dụng xác thực HTTP Basic. Tôi không nghĩ có bất kỳ lý do gì để làm phiền với Digest. Xác thực cơ bản là không an toàn, nhưng được gửi với mọi yêu cầu, do đó bạn không bao giờ cần phải lo lắng về việc xác thực của bạn sẽ cũ hoặc bất cứ điều gì. Bằng cách tạo đường hầm qua HTTPS, bạn có kết nối an toàn.

Nếu bạn muốn xác thực ứng dụng khách, bạn có thể sử dụng chứng chỉ ứng dụng khách SSL.Điều đó nói rằng, khá khó để thực sự khóa máy khách với người dùng độc hại, vì vậy tôi sẽ xem xét các chức năng đăng ký một cách công khai có thể truy cập và bảo vệ bản thân khỏi DOS vv thông qua xác minh tài khoản ngoài băng tần.

+1

Tôi đã làm việc trong dự án này trong thời gian rảnh rỗi và tiếc là tôi đã dừng lại. Tôi đã sử dụng oauth 3 chân. Việc triển khai không dễ dàng và vì API là riêng tư nên không có lợi ích đáng kể so với Basic + https + chứng chỉ ứng dụng khách. Tôi không thử nó nhưng câu trả lời của bạn phản hồi phần quan trọng nhất của câu hỏi (thay thế cho oAuth) vì vậy tôi đánh dấu nó được chấp nhận. Cảm ơn. –

3

Bạn đã cân nhắc sử dụng Xác thực cơ bản chưa?

Tôi chưa sử dụng khung mà bạn đã đề cập, nhưng tôi đã sử dụng auth cơ bản để bảo vệ một số url trong ứng dụng dựa trên web.py và hoạt động tốt.

Về cơ bản, bạn có thể sử dụng mã thông báo trong base64 vốn thực sự là tiêu chuẩn http heeader.

Có lẽ ví dụ này có thể giúp bạn:

class Login: 

    def GET(self): 
     auth = web.ctx.env.get('HTTP_AUTHORIZATION') 
     authreq = False 
     if auth is None: 
      authreq = True 
     else: 
      auth = re.sub('^Basic ','',auth) 
      username,password = base64.decodestring(auth).split(':') 
      if (username,password) in settings.allowed: 
       raise web.seeother('/eai') 
      else: 
       authreq = True 
     if authreq: 
      web.header('WWW-Authenticate','Basic realm="Auth example"') 
      web.ctx.status = '401 Unauthorized' 
      return 
+1

Xe tăng cho câu trả lời của bạn, tôi đánh giá cao sự tham gia của bạn :) nhưng có chính xác cùng một vấn đề với xác thực cơ bản hoặc thông báo. Làm cách nào tôi có thể xác thực người dùng và ứng dụng khách trong cùng một yêu cầu? –

0

Nếu bạn quan tâm đến xác thực cơ bản, đây là thuộc tính nhanh mà bạn có thể sử dụng để trang trí trình xử lý của mình http://www.varunpant.com/posts/basic-authentication-in-web-py-via-attribute. Ví dụ này chủ yếu được viết bằng ngữ cảnh web.py, nhưng tôi đoán nó có thể dễ dàng được tinh chỉnh.

def check_auth(username, password): 
    return username == 'username' and password == 'password' 


def requires_auth(f): 
    @wraps(f)  
    def decorated(*args, **kwargs):   
     auth = web.ctx.env['HTTP_AUTHORIZATION'] if 'HTTP_AUTHORIZATION' in web.ctx.env else None 
     if auth: 
      auth = re.sub('^Basic ', '', auth) 
      username, password = base64.decodestring(auth).split(':') 
     if not auth or not check_auth(username, password): 
      web.header('WWW-Authenticate', 'Basic realm="admin"') 
      web.ctx.status = '401 Unauthorized' 
      return 

     return f(*args, **kwargs) 

    return decorated 
0

Điều này có thể hơi muộn nhưng điều này đã giúp tôi rất nhiều. Về cơ bản giải thích cách an toàn làm việc trong amazon (họ không hỗ trợ oauth)

http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/

+1

Cảm ơn bạn đã đọc, FYI oauth đang sử dụng phương pháp được mô tả trên liên kết của bạn (chữ ký khóa công khai/riêng tư) để xác thực khách hàng. –

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