1

Flask-Restless を使用して、非常にシンプルな REST API を作成しています。認証を追加したいのですが、get/post/delete 呼び出しのみを行い、get 呼び出しは公開したままにします。

これまでのところ、views.py ファイルに次のように記述しました。

manager = flask.ext.restless.APIManager(app, flask_sqlalchemy_db=db)
manager.create_api(models.mymodel, methods=['GET', 'POST', 'DELETE'])

認証のためのさまざまなソリューションを調べましたが、それらはすべて「大きすぎる」ように見えます。PUT/POST/DELETE 呼び出しを実行できるユーザーを 1 人だけ設定し、「パブリック」ユーザーは GET のみを使用します。

簡単な方法は次のようにする必要があると思います。

  • get 呼び出しを行うパブリック ユーザー: 現在のように API 応答を返します。
  • put/post/delete 呼び出しを行うパブリック ユーザー: 「許可されていません」という応答を返します。
  • get/put/post/delete 呼び出しを行う登録ユーザー: 登録されているかどうかを確認し、適切な応答を返します。

「チェック」は、秘密鍵をconfig.pyファイルに保存し、それを API 呼び出しのヘッダーの属性と比較するようなものであってはなりませんか? いくつかのチュートリアルで見たように、ユーザー用のテーブル全体を作成し、それでusernames+passwordAPI トークンを生成するのは「大きすぎる」ため、ここでは不要だと思います。重要なのは'secret-key' : mysecretkey、ヘッダーにいくつか入れることができるということです。何か不足していますか?

ありがとう!

4

3 に答える 3

2

これは、のpreprocessors 引数を使用して行うことができますcreate_api。例えば:

# replace the next line with your favorite way or reading config files
access_password = 'mysecretkey'

def check_credentials(**kwargs):
    if flask.request.headers.get('X-Secret-Key','') != access_password:
        raise flask_restless.ProcessingException(code=401)  # Unauthorized

# create API
manager = flask_restless.APIManager(app, flask_sqlalchemy_db=db)
manager.create_api(models.mymodel, methods=['GET', 'POST', 'DELETE'],
                   collection_name='myobjects',
                   preprocessors={
                        'POST': [check_credentials],
                        'DELETE_SINGLE': [check_credentials],
                   })

Python 3.4、Flask 0.11.1、Flask-Restless 0.17.0 でテスト済み。Flask-Restless の古いバージョンでは、DELETE代わりにDELETE_SINGLE, と別のパッケージ名が必要になる場合があります。

cURL を使用して API のパスワードで保護された部分にアクセスする方法の例:

curl -X POST -d '{"data":"my JSON data, etc."}' \
     -H "Content-Type: application/json" \
     -H "X-Secret-Key: mysecretkey" \
     http://localhost:5000/api/myobjects

これは単純なスキームですが、将来アプリが大きくなる可能性がある場合は、Flask-JWTを使用することをお勧めします。データベースのバックエンドがあれば、大規模で複雑である必要はありません。最小限の実装での開始ケース (ハードコードされたパスワードで使用されるもの) は次のとおりです。

# Anonymous object is sufficient here, a full-blown solution would define a class User
admin_user = type('', (object,), {"id": 1, "username": "admin", "password": "mysecret"})()

def authenticate(username, password):
    if username == admin_user.username and password == admin_user.password:
        return admin_user

def identity(payload):
    id = payload['identity']
    if id == admin_user.id:
        return admin_user


jwt = JWT(app, authenticate, identity)


@jwt_required()        
def check_credentials(**kwargs):
    pass

# create API as in the first example

Python 3.4、Flask 0.11.1、Flask-Restless 0.17.0、Flask-JWT 0.3.2 でテスト済み。

于 2016-11-21T22:35:23.590 に答える
0

Flask-jwtを試すことができます。統合は簡単です。そこには簡単な例もあります。また、3 番目の箇条書きのようなものを実装する方法も見つけました。解決策があれば共有してください。

于 2015-12-01T04:59:39.703 に答える
0

HTTP 基本認証が存在する場合、認証を再発明する必要はありません。

于 2017-06-08T22:47:48.427 に答える