使用本地策略的CORS将客户端应用程序authentication为REST API
问题:
只使用本地身份validation策略为客户端应用程序提供安全的API。
红色箭头是知识差距的一部分。
语境:
即— client.example.com
正在向api.example.com/login
一个POST ,成功的client.example.com
可以访问api.example.com/secret
等GET服务。
一个主意!
在API前面实现混合授权types的OAuth 2.0的实现。
为什么要混合
-
它不会是一个
Implicit Grant Flow
即Client-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.js或Backbone.js)进行请求的工作示例。
这个例子应该与上面描述的上下文匹配。
我正在使用一个非常类似的体系结构的应用程序,尽pipe服务是.NET Web API而不是Node,我们正在使用DotNetOpenAuth作为OAuth提供程序。 而不是混合的方法,你build议我们做以下几点:
- x.com提供login页面
- login页面将证书发回到x.com
- x.com上的服务器端逻辑将client_id和client_secret与凭证相结合,以提交令牌请求(上面提到的资源所有者密码凭证授予 ),同时接收临时访问令牌和刷新令牌
- 刷新令牌被encryption成由x.com发布的cookie
- 然后cookie(带有encryption的刷新令牌)和临时访问令牌被发送到浏览器
- 客户端应用程序(在我的情况下angular)现在可以使用访问令牌来打api.x.com的服务(看来你很清楚CORS的限制…我们砍了angular的$资源的一个版本,以方便这个,但它不是很漂亮,因为我们想要使用所有的HTTP动词,并支持IE9)
- 当访问令牌到期时,客户端应用可以从x.com请求新的访问令牌
- 服务器端,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和开源的回购在这里。
- 用ng-click单击checkbox不会更新模型
- 找不到模块'../build/Release/bson'] code:'MODULE_NOT_FOUND'} js-bson:无法加载c ++ bson扩展,使用纯JS版本
- 在JasmineJStesting中不会触发AngularJS Promisecallback
- ng-click在指令的模板中不起作用
- Django Rest框架中的用户authentication+ Angular.js Web应用程序
- 创build通用控制器function
- 如何使用angularjsdynamic设置HTML元素的id属性?
- 我如何检查我正在使用哪个版本的Angular?
- 停止在ng-show / ng-hide上发生的Angularanimation