Restful Login – 正确实施

RESTful服务的新手,但在这个主题上阅读了很多。 在VS2010 C#中实现

在stackoverflow上已经提出并回答了类似的(几乎相同的)问题,但老实说,我从回复中没有学到任何东西。

我想实现一个AuthenticatUser调用,其中发送用户名和密码并返回一个validation密钥。

鉴于这需要通过GET,POST,PUT或DELETE来完成,看起来GET是最合适的。

所以也许GET mydomain / myservice / authenticate / {username} / {password}

我不喜欢这个,因为用户名和密码是在URI中传递的,但据我所知,在GET中发送正文并不是一个好主意。 所以POST或PUT可以工作,但这似乎与RESTFul哲学背道而驰。

问题1:在URL中发送密码等敏感数据是否可以? 该网站将使用SSL。

问题2:在GET中,当有多个参数被传递时,似乎URI概念会有点疯狂,复杂的查询应该如何被RESTful处理?

问题3:RESTful API中首选的(正常的,最常见的)身份validation方法是什么?

在url中传递密码是不正确的。 我对此做了一些研究。 首先,如果可能,您应该使用基于SSL的基本身份validation。 在Authentication头中传递用户标识和密码。 现在就rest而言,会话不在服务器中维护。 因此,您需要为每个呼叫传递用户ID和密码。 将密码存储在本地存储中是有风险的。 因此,使用POST调用进行首次身份validation并传递用户ID和密码。 然后,在成功validation返回时,服务器返回tokenkey和tokenvalue。 tokenkey和tokenvalue最初类似于Amazon私钥分享。 从下一个请求开始发送令牌密钥并使用tokenvalue签署您的数据。 每次都传递令牌密钥和签名。 在serverend上,服务器validation签名,因为它具有tokenvalue的副本。 如果可能,加密可以在本地存储tokenkey和tokenvalue。 您不能永远使用tokenkey和tokenvalue。 因此,在每个请求上,服务器发送一个nonce作为响应。 此随机数存储在服务器端的数据库中,并针对每个请求进行更改。 当您向服务器发送请求时包含此nonce。 nonce是使用时间戳形成的。 如果在15分钟后发送请求,则解密nonce,并且发现时间戳超过15分钟,因此您将其重定向到登录页面。 Nonce的形成在http://www.ietf.org/rfc/rfc2617.txt中给出。 一旦成功validation了随机数,就会丢弃此随机数,并且现在发送一个新的随机数(使用最新的时间戳再次形成)。 这也有助于防止重放攻击。