我正在为移动应用程序设计一个 API,我希望它保持 RESTful。
API 是使用 Basic HTTP Auth 授权的,但是,当用户第一次打开应用程序时,他需要先登录,所以我需要设计一个 API 来检查用户的凭据,它将接受一对用户名和密码,相应地返回成功或失败。
问题是网址应该是什么所以它很安静?我不认为 /login 是一个好的。
5 回答
通过 HTTP请求传递敏感数据通常被视为不好的做法。GET
密码信息是敏感数据,是违反幂等操作应该是GET
请求的规则的例外之一。
为什么这是一个例外?浏览器历史记录和服务器日志将存储GET
请求。这意味着此敏感信息在两个地方都以纯文本形式显示。因此,如果有人掌握了其中任何一个 - 那么该信息现在就在他们手中。
您应该使用 HTTPPOST
请求将此敏感信息传递给 RESTful API,因为浏览器不会存储它们,服务器也不会记录它们。但是,第一道防线是使用安全 HTTP (HTTPS) 来确保这些信息不受外来者的影响。
因此,将 HTTP 请求正文中的此信息传递给 HTTPS URL。
一个好的方法是GET
请求当前用户的帐户/个人资料信息。并让它返回用户名、设置、头像 url 等,me
这是一个经常用作身份验证用户的简写标识符。
GET https://api.example.com/profiles/me
HTTP/1.1 200 OK
{
"username": "bob",
"id": "xyz",
"created_at": 123,
"image_url": "https://example.com/bob.png"
}
来自维基百科:
客户端-服务器通信进一步受到请求之间没有客户端上下文存储在服务器上的限制。来自任何客户端的每个请求都包含服务请求所需的所有信息,并且任何会话状态都保存在客户端中。
因为服务器不存储来自客户端的会话状态,所以您的 API不应该公开任何登录/注销功能:在每个请求中,您应该发送用户凭据,并且服务器每次都应该验证它们。
检查SO 中的这个讨论,它澄清了这个概念。
我同意 Carlos 的观点——在普通的 restful API 中,没有会话,因此您无法进行一次身份验证然后重用会话,您实际上需要在每次调用时传递凭据集(不理想)。
在这种情况下,听起来您最好使用其中一个 openAuth (http://www.oAuth.net) - 这通过在应用程序首次运行时进行身份验证然后生成访问令牌以允许在每次调用中进行访问来工作(+一个刷新令牌)。
(您可能会争辩说访问令牌是状态 - 它有点像 - 但是,至少它通常寿命明显更长)。
GET https://api.example.com/auth
设置了授权标头。