从基于会话的令牌机制转移到OAuth 2.0机制

时间:2014-02-17 09:12:52

标签: javascript rest authentication oauth-2.0 playframework-2.2

我拥有一个Play Framework应用程序,充当后端服务器,提供一组REST API 在客户端,我拥有一个AngularJS应用程序,它通过AJAX从后端服务器调用API。

目前,我使用基于会话令牌机制的解决方案 这意味着每次用户成功登录时,都会在客户端检索包含身份验证令牌的cookie 然后,在每个请求中,在服务器上提取由客户机请求提供的cookie值(auth令牌),如果有效,则发出请求。

现在我想使用OAuth 2.0。原因是? :

  • 这是保护API的一种很好的标准方法,避免使用数据存储区(Memcached)在服务器端保留auth令牌,正如我目前所提供的那样。
  • 我想通过提供一些client_secret和nonce来避免一些重播攻击等提供比单一cookie更好的安全性......
  • 我想限制能够调用我提供的公共REST API的客户端数量,这意味着允许匿名调用的API,例如列出项目列表。

关键是我不涉及第三方,因为所有受保护的资源都是我自己的 我遇到了这个问题article,解释了如何使用OAuth 2.0来保护内部REST API,而不是像往常一样实现两条腿而不是三条腿。

但是,在调用需要对用户进行身份验证的REST API时,我无法弄清楚客户端凭据流如何对特定用户进行身份验证。

事实上,客户端凭据流似乎基于全局client_idclient_secret密钥(应用程序的全局,因此在我的情况下是我的Javascript应用程序),因此对目标不够具体特定用户和控制器的特定权限。

任何帮助都会很棒。

1 个答案:

答案 0 :(得分:3)

似乎您应该使用“资源所有者密码凭据授权”(http://tools.ietf.org/html/rfc6749#section-4.3)。它很简单 - 将客户端ID /机密放在Authorization标头中,并将用户名/密码放在查询变量中。以下是RFC的一个示例:

POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded

grant_type=password&username=johndoe&password=A3ddj3w

服务器端,您可以检查客户端(您的JavaScript应用程序)和用户的有效性。请记住,保护客户端凭据是不可能的,因为它将嵌入到您的(可下载的)JavaScript代码中。用户名/密码由最终用户直接输入。