0

我是一名初学者网络开发人员,我对我开发的 API 的安全性有一些疑问。这是一个简单的 Web 服务,需要身份验证才能访问/修改数据。

我想知道通过 HTTP 对用户进行身份验证的最佳做法是什么。

目前我的应用程序是这样的:

用户通过需要用户名和密码的 API 请求 (POST) 进行身份验证。响应包含有关用户的信息和将来用于进一步请求的 TOKEN。

我的担忧:我不知道身份验证请求是否应该是 POST。这听起来更像是一个 GET,因为 POST 应该创建一些东西(至少这是 Ruby on Rails 中的约定)。然后,即使使用 POST 或 GET,在信息传输过程中信息仍然是“可见的”。我听说了一些关于 HTTPS 的事情——它是如何解决问题的?

令牌在用户创建时生成 - 并且在时间上保持不变。这很糟糕吗?是否应该在“注销”后再次生成令牌?我见过使用 API_KEY 和令牌进行身份验证的 API。这是如何运作的?

我有一些 GET 请求来检索有关某事的信息。通过此请求,我将从身份验证请求中检索到的令牌作为参数传递。这个可以吗?我的意思是令牌是敏感信息。

我在哪里可以找到关于我的这些问题的更多信息(书籍、文章、w/e)?

4

2 回答 2

1

GET 的问题更多是物理安全而不是网络安全——我知道我经常在工作中或在家中与其他人一起登录网站——我当然不希望我的凭据作为查询字符串附加到 URL。

使用 HTTPS (SSL) 将保护您的 postdata,因为信息在通过线路发送之前已加密。加密算法使用一些非常聪明的数学来生成其解密令牌,以确保它不易受到中间人攻击。

于 2012-12-04T16:11:14.430 回答
1

HTTPs 会加密到您网站的所有流量,因此会隐藏任何获取和发布请求。它要求您购买 HTTPS 证书(便宜),并获得一个非共享 IP 来托管(不那么便宜)。(如果有人谈论自签名证书 - 好吧,这是可能的,但如果外部人员想与您的服务交谈,则不建议这样做)。

拥有一个持久的登录令牌可能很糟糕,这取决于你想要什么样的不可否认性。如果有人可以在 2 年前登录,并继续使用令牌,你怎么知道它仍然是原始请求者?令牌应该过期并且可以重新请求。

API 密钥通常适用于带外交换的共享密钥(通常通过从托管商的网站获取)。使用自定义身份验证方案和标头,并且必须为每个请求计算和检查。这不需要 HTTPS - 共享密钥用于生成身份验证标头,但不与它一起发送,因此该密钥不会随每个请求一起传播。当然,您需要编写此代码,并弄清楚您想要的过程是什么。除非您知道自己在做什么,否则我通常会避免这种情况-您需要对请求进行规范表示,对其进行签名,然后将其用作标头。这并不复杂,但也不简单。

于 2012-12-04T16:14:29.150 回答