使用本地策略的CORS将客户端应用程序authentication为REST API

问题:

只使用本地身份validation策略为客户端应用程序提供安全的API。
红色箭头是知识差距的一部分。

在这里输入图像说明

语境:

即— client.example.com正在向api.example.com/login一个POST ,成功的client.example.com可以访问api.example.com/secretGET服务。

一个主意!

在API前面实现混合授权types的OAuth 2.0的实现。

为什么要混合

  • 它不会是一个Implicit Grant FlowClient-Side Web Applications Flow因为没有redirect到API服务器也授予访问令牌。 (即) “访问您的数据是否可以?”

  • 它不会是Resource Owner Password Flow因为客户端ID和客户端密钥与请求一起传递,所以假定客户端应用程序是服务器端。

好的…那么两者有什么关系呢?

如果我们在客户端应用程序的页面加载中使用CRSF令牌,并将其与用户凭证一起POST,OAuth 2.0身份validation端点将交换访问令牌? 您将在成功login后使用访问令牌和CRSF令牌对每个后续请求进行身份validation。

一个好的Node.js OAuth 2.0库我发现:

https://github.com/ammmir/node-oauth2-provider

帮我!

我无法find解决此问题的validation措施的工作示例! 把我指向正确的方向?

最终,这里的目标是使用CORS和本地策略(即用户名和密码)来validation客户端应用程序到REST API,即使上述约定是不可能的。

容纳赏金:

这是一个客户端应用程序,所以让我们保持时尚。

我正在寻找一个使用上面的API / Auth服务器的Node.js OAuth 2.0种子和前端框架(如Angular.jsBackbone.js)进行请求的工作示例。

这个例子应该与上面描述的上下文匹配。

我正在使用一个非常类似的体系结构的应用程序,尽pipe服务是.NET Web API而不是Node,我们正在使用DotNetOpenAuth作为OAuth提供程序。 而不是混合的方法,你build议我们做以下几点:

  1. x.com提供login页面
  2. login页面将证书发回到x.com
  3. x.com上的服务器端逻辑将client_id和client_secret与凭证相结合,以提交令牌请求(上面提到的资源所有者密码凭证授予 ),同时接收临时访问令牌和刷新令牌
  4. 刷新令牌被encryption成由x.com发布的cookie
  5. 然后cookie(带有encryption的刷新令牌)和临时访问令牌被发送到浏览器
  6. 客户端应用程序(在我的情况下angular)现在可以使用访问令牌来打api.x.com的服务(看来你很清楚CORS的限制…我们砍了angular的$资源的一个版本,以方便这个,但它不是很漂亮,因为我们想要使用所有的HTTP动词,并支持IE9)
  7. 当访问令牌到期时,客户端应用可以从x.com请求新的访问令牌
  8. 服务器端,x.com解密cookie以获取刷新令牌,并发出另一个oauth调用新的访问令牌

这是相当高的水平,但希望给你一个如何解决你的情况的感觉。 就我而言,我们不希望使用会话状态或数据库来存储刷新令牌,但显然暴露给浏览器引入了安全问题,因此刷新令牌的encryption很重要(除其他安全性外注意事项),使用cookie可以避免在x.com上使用会话状态或其他永久性存储。

我已经使用Node和PassportJS构build了这个示例,以展示如何使用Facebook或本地策略对用户进行身份validation。 双方都在你描述的不同领域,它需要启用CORS。

GitHub: https : //github.com/pablodenadai/Corsnection
现场演示: http : //corsnection-client.herokuapp.com/

不是为了获奖而回答的问题。 只是我2美分:)

在我的networking服务器上,

我通过使用基本身份validation通过httpslogin/密码的rest电话来进行身份validation。 这个调用为客户端提供了一个键(一个页面的web应用程序)。

然后每个REST调用都使用密钥进行签名。 服务器检查签名是否正确,并且https中的所有内容仍然存在。

我相信这个机制是相当有用的。

我没有看到与跨域的问题。 我有一个单一的来源,如果我需要从另一个来源的东西,我会使用JSONP。

我使用nginx作为https-> http转发器。

不确定它如何与OAuth2解决scheme竞争。

我不能保证我有时间写作实例,但我可以告诉你2个path:)

最大的交易是CORS。 解决这个问题后,使用$ http服务很容易。 所以,首先也许最简单的可能是在x.com webserver中configuration指向api.x.com的反向代理。 我在这里写文章

第二种方法更好,并为此目的而创build,以授权特定域使用您的资源。 它涉及api.x.com中的一些编码,因此您不必在其他域中的新Web应用程序中进行任何更改。 您只需要在api.x.com服务中授权CORS请求。

  • 在数据库中创build表,您可以pipe理授权域列表
  • 在表中添加logging“x.com”
  • 在api.x.com添加请求filter/拦截器什么样的技术术语,你应该在处理请求后调用方法,并添加响应Access-Control-Allow-Origin: x.com如果请求来自x.com换句话说,检入请求头引用值与上表中的任何值相匹配,并将该值放入访问控制允许原始响应头中。

这就是所有:)在这之后,如果你知道如何使用$ http或jQuey.ajax,你将能够POST / PUT / DELETE / …在几分钟内从任何授权的域对api.x.com的任何请求。

我非常类似的想法,使用vinilla js web应用程序和跨域身份validationGAE后端或OpenID连接。

Web应用程序在CDN上运行。 当点击login链接时,它将转到相应的login服务器并redirect到Web应用程序(使用XSRF安全令牌和HTTPS唯一cookie)。 login服务器接受具有凭据的跨域请求。 每个请求都必须设置XSRF令牌(在标题中)。 cookie由浏览器设置。 由于它是仅HTTP的cookie,所以JS不能读取它。 这项技术非常安全。

login后,您可以从login服务器获得安全评估。

有关详细的描述,你可以在这里find和开源的回购在这里。