2012-04-13 65 views
10

我正在为移动应用程序设计一个API,并且我希望将它保持为RESTful。
API的授权使用Basic HTTP Auth,但是,当用户第一次打开应用程序时,他需要先登录,所以我需要设计一个API来检查用户的凭据,它将接受一对用户名和密码密码,返回成功或相应失败。
问题是什么网址应该是这样,它是宁静的?我不认为/登录是一个好的。如何设计一个RESTful API来检查用户的凭据?

回答

6

一个好方法是对当前用户的帐户/资料信息执行GET请求。并让它返回用户名,设置,头像网址等。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" 
} 
5

维基百科:

的客户机 - 服务器通信由没有客户 上下文进一步限制被存储请求之间的服务器上。来自 的每个请求都包含为服务 请求所需的所有信息,并且任何会话状态都保留在客户端中。

因为服务器存储从客户端没有会话状态,你的API 应该不会暴露任何登录/注销功能:在每一个要求,你应该发送用户凭据,服务器应该每次都验证它们。

检查this discussion in SO,它克服了这个概念。

0

我同意卡洛斯 - 在一个正常的宁静的API中,没有会话,所以你不能验证一次然后重新使用会话,你实际上需要在每次调用时都传递凭据集(不理想)。

在这种情况下,它听起来像你会更好地使用openAuth(http://www.oAuth.net)之一 - 这是通过验证应用程序第一次运行时的身份验证,然后生成访问令牌以允许在每次通话中访问(+刷新令牌)。

(你可能会认为访问令牌是状态 - 它的类型 - 但是,至少它通常会长得多)。

+0

是的,我在每次通话时都通过了凭证设定,但是我确实需要登录才能检查用户的凭证,当他们第一次打开应用程序 – wong2 2012-04-14 08:45:01

+0

时,我没有保留会话cookie或任何类似 – wong2 2012-04-20 12:55:57

+0

好的 - 所以我想你必须通过凭证*用户名/密码*每个电话是正确的。你要么总是要传递它,要么传递一次会话。 – steve 2012-05-28 20:51:53

6

它通常被认为是不好的做法,通过HTTP GET请求通过敏感数据

密码信息是敏感数据,是破坏idempotent operations应该是GET请求的规则之一。

为什么这是一个例外?浏览器历史记录和服务器日志将存储GET请求。这意味着这两个地方的敏感信息在纯文本中都是可见的。所以,如果有人得到任何一个 - 那么这些信息现在掌握在他们手中。

您应该使用HTTP POST请求将此敏感信息传递给RESTful API,因为浏览器不会存储它们,并且服务器不会记录它们。但是,第一道防线是使用安全HTTP(HTTPS)来确保这些信息不受外界的干扰。

因此,将此信息通过HTTP请求的正文传递给HTTPS URL。

0

GET https://api.example.com/auth

随着授权报头组。