我正在使用Flask-Restful来构建REST服务。然后iOS设备将连接到此REST后端以同步本地数据。
该服务将通过 https 连接进行访问。
REST服务是无状态的,用户必须对每个请求进行身份验证。因此,用户名和密码将以明文格式发送到REST服务。后端将散列密码并检查数据库中现有的散列密码。
api.add_resource(Records, '/rest/records/<string:email>/<string:password>/<string:ios_sync_timestamp>')
现在我用这种方法看到的一个问题是用户名和密码是清晰的格式,作为GET网址的一部分。服务器日志显然会跟踪这个。现在,如果我的后端被黑客入侵,日志文件将损害所有用户名和密码。
最佳解决方案是什么?我想也许可以发送用户名和密码作为POST参数,但是如何使用GET请求呢?
class Records(Resource):
def get(self, email, password, ios_sync_timestamp):
pass
def post(self, email, password, ios_sync_timestamp):
pass
答案 0 :(得分:3)
要使用您想要的用户名和密码验证每个请求,您应该使用:Basic Authentication。
要使用它,它非常简单,适用于所有HTTP方法(GET,POST,...)。您只需要在请求中添加HTTP标头:
Authorization: Basic <...>
<...>
部分是base64中编码的username:password
。
例如,如果您的登录信息为foo
且密码为bar
。 HTTP标头应该包含以下行:
`Authorization: Basic Zm9vOmJhcg==`
通过 HTTPS 连接,它是安全的。
编辑:使用Flask,您可以使用Flask HTTP auth“自动”实现此目的。
答案 1 :(得分:2)
Sandro Munda建议的每次调用中的另一个解决方案是使用API Key
生成POST
来首先检查凭据请求,然后将其传递到请求标头中。然后,您可以使用@before_request
处理程序在每个API处理程序中对其进行严格检查或应用程序范围内的验证。
POST
从现在开始
X-API-Key
。