如何安全地向REST服务发送密码?

时间:2013-10-22 09:54:33

标签: python rest flask flask-restful

我正在使用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

2 个答案:

答案 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
  • 服务器使用API​​密钥回复。就像秘密的暗示一样。

从现在开始

  • 每次客户端需要发送API请求时,都会添加一个标头(让我们用API密钥称它为X-API-Key