9

我正在使用Flask-Restful来构建 REST 服务。然后,iOS 设备将连接到此 REST 后端以同步本地数据。

该服务将通过https连接访问。

REST 服务是无状态的,用户必须对每个请求进行身份验证。因此,用户名和密码将以明文格式发送到 REST 服务。后端将散列密码并检查数据库中现有的散列密码。

api.add_resource(Records, '/rest/records/<string:email>/<string:password>/<string:ios_sync_timestamp>')

现在我用这种方法看到的一个问题是用户名和密码作为 GET url 的一部分采用了清晰的格式。服务器日志显然会跟踪这一点。现在,如果我的后端被黑客入侵,日志文件将危及所有用户名和密码。

什么是最好的解决方案?我在想也许可以将用户名和密码作为 POST 参数发送,但是那我该如何处理 GET 请求呢?

class Records(Resource):
    def get(self, email, password, ios_sync_timestamp):
        pass
    def post(self, email, password, ios_sync_timestamp):
        pass
4

2 回答 2

4

要使用您想要的用户名和密码对每个请求进行身份验证,您应该使用:Basic Authentication

要使用它,它非常简单,它适用于所有 HTTP 方法(GET、POST、...)。您只需在请求中添加一个 HTTP 标头:

Authorization: Basic <...>

<...>部分是username:password用base64编码的。

例如,如果您的登录名是foo,密码是bar. HTTP 标头应该有这一行:

`Authorization: Basic Zm9vOmJhcg==`

通过您的HTTPS连接,它是安全的。

编辑:使用 Flask,您可以使用Flask HTTP 身份验证“自动”实现此目的。

于 2013-10-22T09:57:39.820 回答
2

Sandro Munda 建议的另一种解决方案,而不是在每个调用中使用 Basic Auth 是生成一个API Keyusing aPOST来首先检查凭据请求,然后将其传递到请求标头中。然后,您可以在每个 API 处理程序中对其进行验证,以进行严格粒度检查或使用@before_request处理程序在应用程序范围内进行验证。

工作流程

  • POST客户端使用凭据(用户名/密码)向服务器发送一个
  • 服务器回复一个 API 密钥。就像一个秘密的十六进制摘要。

从现在开始

  • 每次客户端需要发送 API 请求时,它都会添加一个标头(让我们X-API-Key使用 API Key.
于 2013-10-22T10:05:19.523 回答