Python 最简单的身份验证

Python 最简单的身份验证,python,authentication,flask,python-requests,flask-restless,Python,Authentication,Flask,Python Requests,Flask Restless,我正在使用Flask Untivent制作一个超级简单的REST API。我想添加身份验证,但只针对put/post/delete调用,而我想让get调用保持公共 到目前为止,我在views.py文件中添加了以下内容: manager = flask.ext.restless.APIManager(app, flask_sqlalchemy_db=db) manager.create_api(models.mymodel, methods=['GET', 'POST', 'DELETE'])

我正在使用Flask Untivent制作一个超级简单的REST API。我想添加身份验证,但只针对put/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调用,然后“public”用户将只使用GET

我认为一个简单的方法应该是这样的:

  • 进行get调用的公共用户:返回api响应,就像现在一样
  • 进行put/post/delete呼叫的公共用户:返回“未授权”响应
  • 进行get/put/post/delete调用的注册用户:检查其是否已注册并回复相应的响应
“检查”不应该类似于在我的
config.py
文件中存储一个密钥,然后将其与api调用头的属性进行比较?我认为,正如我在一些教程中看到的那样,为用户创建一个完整的表,然后使用
usernames+password
生成API标记太“大”了,在这里没有必要。。因为我将是唯一可以进行身份验证的用户,所以我知道密钥是什么,我可以在头中放入一些
“secret-key”:mysecretkey
。我错过什么了吗

谢谢

您可以尝试,它很容易集成。这里还有一个简单的例子。我还在寻找一种方法来实现第三个要点,如果您有任何解决方案,请与我们分享。

这可以通过
create\u 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 Untivent 0.17.0进行测试。Flask Untivent的旧版本可能需要
DELETE
,而不是
DELETE\u 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
这是一个简单的方案,但如果将来你的应用程序可能会变得更大,我建议你使用它。它不需要很大,也不需要复杂的数据库后端。以下是您在极简主义实现中的开始案例(与硬编码密码一起使用):

# 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 Untivent 0.17.0、Flask JWT 0.3.2进行测试。

当存在HTTP基本身份验证时,无需重新创建身份验证: