15

私は現在、マイクロフレームワーク Flask を使用して Python で REST API を作成しています。これはプライベート API であり、ユーザー データを扱います。この API を使用して、Web と Android アプリを構築する予定です。

今のところ、ダイジェスト認証を使用してプライベート ユーザー データを保護しています。たとえば、ユーザー bob を使用して私のサービスにデータを投稿する場合は、myapi/story/create で投稿リクエストを作成し、bob の資格情報にダイジェスト パターンを指定します。

私はこれが良い解決策ではないことを認識しています: -
ダイジェスト認証は安全ではありません
-クライアントは認証されていません (新しいユーザーを作成するなど、現在のユーザーに関連しない要求を保護する方法は?)

oAuth について多くのことを読みましたが、API をサードパーティに公開する予定がないため、3-legged 認証はやり過ぎのようです。
2-legged oAuth は、ユーザーではなくクライアントの認証のみを提供するため、適合しません。
oAuth のもう 1 つの問題は、Python で oAuth を実装するための包括的なガイドが見つからないことです。python-oauth2ライブラリは見つかりましたが、サーバーの例がわかりませんし、追加のドキュメントも見つかりません。さらに、この例では oAuth の多くの側面がカバーされていないようです。

だから私の質問は:

  1. 妥当なレベルのセキュリティでクライアントとユーザーの両方を認証するための代替スキーム (oAuth ではない) はありますか?
  2. oAuth が最適なソリューションである場合:
    • 承認プロセスをスキップする方法 (ユーザーがサードパーティ クライアントを承認する必要がないため)?
    • python-oauth2 またはその他の Python ライブラリの詳細なドキュメントはありますか?

ヘルプやアドバイスをいただければ幸いです。

4

3 に答える 3

8

簡単な答えは、HTTPS のみを介して API を公開し、HTTP 基本認証を使用することです。Digest を気にする理由はまったくないと思います。基本認証は安全ではありませんが、リクエストごとに送信されるため、認証が古くなるなどの心配をする必要はありません。HTTPS を介してトンネリングすることにより、安全な接続が得られます。

クライアントを認証する場合は、SSL クライアント証明書を使用できます。とはいえ、一般的に、悪意のあるユーザーに対してクライアントを完全にロックダウンするのはかなり難しいため、サインアップ機能をオープンにアクセスできるようにし、帯域外アカウント検証によって DOS などから身を守ることを検討します.

于 2012-06-03T21:17:12.760 に答える
4

Basic 認証の使用を検討したことはありますか?

あなたが言及したフレームワークはまだ使用していませんが、基本的な認証を使用して web.py に基づくアプリでいくつかの URL を保護し、正常に機能しました。

基本的に、実際には標準の http ヘッダーである base64 でトークンを使用できます。

多分この例はあなたを助けることができます:

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
于 2011-08-29T13:11:33.627 に答える
0

基本認証に関心がある場合は、ハンドラーを装飾するために使用できるクイック属性を次に示します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
于 2013-01-25T21:25:47.097 に答える