簡體   English   中英

尋找建議來保護用python-flask編寫的私有REST API

[英]Looking for advice to secure a private REST API written in python-flask

我目前正在使用微框架Flask在python中編寫一個rest API。 它是一個私有API,它處理用戶數據 我計划使用此API來構建網絡和Android應用。

現在我使用摘要身份驗證來保護私人用戶數據。 例如,如果您想使用用戶bob在我的服務上發布數據,您可以在myapi / story / create上發布請求,並使用摘要模式提供bob的憑據。

我知道這不是一個好的解決方案,因為:
-Digest auth不安全
- 客戶端未經過身份驗證(如何保護與當前用戶無關的請求,例如創建新用戶?)

我閱讀了很多關於oAuth的內容,但是三腳認證似乎有點過分,因為我不打算向第三方開放我的API。
2腳oAuth不適合,因為它只為客戶提供身份驗證,而不是為用戶提供身份驗證。
oAuth的另一個問題是我沒有找到在Python中實現它的綜合指南。 我找到了python-oauth2庫,但我不了解服務器示例,我找不到其他文檔。 此外,似乎oAuth的許多方面都未包含在此示例中。

所以我的問題是:

  1. 是否有替代方案(不是oAuth)用於以合理的安全級別對客戶端和用戶進行身份驗證?
  2. 如果oAuth是最好的解決方案:
    • 如何跳過授權過程(因為用戶不必授權第三方客戶端)?
    • 是否有python-oauth2或任何其他Python庫的詳細文檔?

任何幫助或建議將不勝感激。

簡單的答案是僅通過HTTPS公開您的API,然后使用HTTP基本身份驗證。 我認為沒有理由去理解Digest。 基本身份驗證是不安全的,但隨每個請求一起提交,因此您永遠不必擔心您的身份驗證過時或者其他問題。 通過HTTPS隧道傳輸,您可以獲得安全連接。

如果要對客戶端進行身份驗證,可以使用SSL客戶端證書。 也就是說,一般來說真的很難將客戶端鎖定在惡意用戶身上,所以我會考慮讓注冊功能公開訪問,並通過帶外帳戶驗證保護自己免受DOS等攻擊。

您是否已考慮使用基本身份驗證?

我還沒有使用你提到的框架,但我使用基本的auth來保護基於web.py的應用程序中的一些網址並且工作正常。

基本上,你可以在base64中使用一個令牌,它實際上是一個標准的http heeader。

也許這個例子可以幫助你:

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

如果您對基本身份驗證感興趣,可以使用以下快速屬性來裝飾處理程序http://www.varunpant.com/posts/basic-authentication-in-web-py-via-attribute 這個例子主要是在web.py上下文中編寫的,但我想它可以很容易地調整。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM