Python 最简单的身份验证
我正在使用Flask Untivent制作一个超级简单的REST API。我想添加身份验证,但只针对put/post/delete调用,而我想让get调用保持公共 到目前为止,我在views.py文件中添加了以下内容: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'])
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基本身份验证时,无需重新创建身份验证: