9

Flask-Restfulを使用して REST サービスを構築しています。iOS デバイスは、この REST バックエンドに接続してローカル データを同期します。

サービスはhttps接続を介してアクセスされます。

REST サービスはステートレスであり、ユーザーは要求ごとに認証する必要があります。したがって、ユーザー名とパスワードはクリア形式で REST サービスに送信されます。バックエンドはパスワードをハッシュし、データベース内の既存のハッシュされたパスワードと照合します。

api.add_resource(Records, '/rest/records/<string:email>/<string:password>/<string:ios_sync_timestamp>')

このアプローチで私が目にする 1 つの問題は、ユーザー名とパスワードが GET URL の一部として明確な形式になっていることです。サーバーログは明らかにこれを追跡します。バックエンドがハッキングされた場合、ログ ファイルはすべてのユーザー名とパスワードを危険にさらします。

これに対する最善の解決策は何ですか?ユーザー名とパスワードを POST 引数として送信することを考えていましたが、GET リクエストでどのようにすればよいでしょうか?

class Records(Resource):
    def get(self, email, password, ios_sync_timestamp):
        pass
    def post(self, email, password, ios_sync_timestamp):
        pass
4

2 に答える 2

4

必要なユーザー名とパスワードで各リクエストを認証するには、次を使用する必要があります: Basic Authentication

使い方はとても簡単で、すべての HTTP メソッド (GET、POST など) で動作します。リクエストに HTTP ヘッダーを追加するだけです。

Authorization: Basic <...>

この<...>部分はusername:passwordbase64 でエンコードされています。

たとえば、ログインがfooで、パスワードがbar. HTTP ヘッダーには次の行が含まれている必要があります。

`Authorization: Basic Zm9vOmJhcg==`

HTTPS接続により、安全です。

編集:Flaskを使用すると、Flask HTTP認証を使用してこれを「自動的に」実現できます。

于 2013-10-22T09:57:39.820 に答える
2

Sandro Munda によって提案されているように、各呼び出しで Basic Auth の代わりに別の解決策は、最初に資格情報を確認するためにAPI Keyを使用してPOST要求を生成し、それを要求ヘッダーに渡すことです。次に、ハンドラーを使用して、厳密な粒度のチェックまたはアプリケーション全体の各 API ハンドラーでそれを確認できます@before_request

ワークフロー

  • クライアントPOSTは資格情報 (ユーザー名/パス) をサーバーに送信します。
  • サーバーは API キーで応答します。何か秘密の hexdigest のように。

今後

  • クライアントが API リクエストを送信する必要があるたびに、ヘッダーが追加されます ( X-API-KeyAPI キーを使用して呼び出しましょう)。
于 2013-10-22T10:05:19.523 に答える