网站和RESTful API的“共享”身份验证

时间:2014-01-23 23:57:02

标签: api http rest authentication restful-authentication

目标:我的服务器需要将非用户定向到登陆/主页,并将用户登录到实际应用。加载应用程序后,它将对RESTful API(通过Ajax)进行身份验证的 HTTP请求。

我有一个需要身份验证的RESTful API。在另一台服务器上,我有我的网站,也需要身份验证,因此我可以确定是为非用户显示登陆/主页还是为登录用户显示应用程序。

最初我认为为RESTful API实现HTTP Basic Auth就足够了。但是,为了让我的网站运行身份验证,我还需要在那里设置身份验证,这意味着复制低级代码以检查REST API和网站服务器中数据库中的凭据。

或者,我想知道该网站是否可以通过RESTful API进行身份验证。例如,在POST /login的请求处理程序中,我可以向我的API发出GET请求,并从请求正文传递用户凭据。如果请求返回200 OK,我可以签署用户的会话,从而验证它们。从那时起,对REST API的Ajax请求需要使用相同的凭据进行身份验证,因此我可以:

  • 设置包含凭据的cookie,从而允许JavaScript在执行请求之前检索凭据(使用SSL确定?)
  • 将凭据转储到Web应用程序的服务HTML中,从而允许JavaScript在执行请求之前检索凭据(使用SSL确定?)
  • 通过网络应用服务器代理API,我可以从会话中检索凭据并将其添加到代理请求的Authorization标头中吗?

或者,我想我可以在两台服务器之间共享一个会话,虽然我听说这是RESTful设计的不良做法。

这样做会有什么问题?有没有更好的方法来实现我的目标?

2 个答案:

答案 0 :(得分:3)

我最近实现了类似的东西(假设我理解正确),似乎有一些可行的选择。

  • 在访问REST API时,让您的Web应用程序的服务器端始终使用特定的用户名/密码进行身份验证,确保您的Web应用程序始终受信任,并假设用户已正确登录Web应用程序(如果有请求已通过身份验证。
    • 优点:易于实现,易于理解,也易于扩展到其他应用程序(我们有一个访问相同REST API的CLI)。
    • 缺点:REST API无法知道哪个用户实际正在访问它。如果受信任的客户端遭到入侵,则整个系统都会受到损害。
  • 让您的Web应用程序的服务器端在会话中保留用户详细信息,并在每次访问REST API时使用用户凭据进行身份验证。
    • 优点:相当容易实现(虽然一些身份验证机制使得很难保持用户密码 - 有充分理由)。整个过程对REST API是透明的。
    • 缺点:您现在正在(在所有意图和目的中以明文形式)存储用户在Web服务器会话中的用户名和密码 - 这是系统中攻击的最主要目标之一。 / LI>
  • 在REST API上创建一个身份验证系统,该系统使用用户名/密码授权对请求进行身份验证,并返回在有限时间内有效的令牌。
    • 优点:更安全,如果您的网络应用遭到入侵,您不会向攻击者提供您的用户用户名/密码,而只是允许他们在有限的时间内访问。
    • 缺点:实施起来要困难得多。您可能需要专门处理令牌超时。对于纯粹主义者而言,这也意味着您的REST实施(或至少是身份验证系统)可以称之为“有状态”。

您应该实施的具体取决于您的情况。我个人肯定会选择更安全的选项(最后一个选项),但是由于外部限制,我们被迫在我们的特定情况下实现第一个选项(承诺我们会重新访问并稍后升级 - 不幸的是后来永远不会来)。

答案 1 :(得分:0)

我认为您在REST服务中使用基本HTTP身份验证并让您的应用通过该服务进行身份验证的方法非常好。这里唯一的警告(我相信你知道),你的REST服务应该通过SSL运行,因为基本的HTTP身份验证不是很安全 - 用户名和密码只是Base64编码。