7

上下文:Ember-Data + AMS => JSON或HTTP标头的Ember.js验证令牌?

我有一个Ember.js 1.1.0-beta.1应用程序与Rails-API服务器(Rails 4)交换JSON数据。 JSON数据交换使用Ember-Data 1.0.0-beta.2和Active Model Serializer 0.8.1(AMS)完成。我使用Ember-Data和AMS的默认推荐配置,并且符合JSON-API规范。

在任何给定的RESTful呼叫上,客户端将当前身份验证令牌传递给服务器。身份验证令牌已验证并退役,并且会生成一个新的身份验证令牌并将其发送回客户端。因此,每个RESTful调用都会在请求中接受认证令牌,并在客户端可缓存并用于下一个RESTful调用的响应中提供新的认证令牌。

问题:

我应该把认证令牌在每个请求和响应?

它是否应该是请求和响应中每个对象的JSON的一部分?如果是这样,放置在现有对象的JSON结构中的令牌在哪里(与认证无关)?

还是应该将它们放在每个请求和响应对象的HTTP标头中?

什么是“Ember方式”,最终可能会在新的Ember Guides Cookbook中找到?

更多的上下文:

我已经熟悉了以下几个环节:

...我正在寻找超出这些范围的答案,并且特定于Ember-Data + AMS。

随着需要传递一个新的令牌返回给客户端通过灰烬,数据响应除外,假设我的客户端代码,否则类似于在GitHub上@machty Embercast例如:https://github.com/embercasts/authentication-part-2/blob/master/public/js/app.js

谢谢非常!

回答

2

我已经构建了类似的东西,虽然我没有重置令牌,除非用户注销。

我不会把它放在请求主体本身 - 你只是要污染你的模型。可能没有Ember方式,因为这更像是一个运输问题。我使用自定义HTTP标头和/或cookie传递标记。 Cookie需要授权文件下载,这不能通过ajax完成,尽管cookie也适用于ajax调用。在你的情况下,我会使用一个cookie,并让服务器每次都将它设置为新值。但是,您在每个JSON请求上重置标记的方案不适用于同时发生的请求。这真的有必要吗?如果你使用TLS,你可能不需要太担心。您也可以超时该令牌,以便如果10分钟内没有请求,则会生成新的令牌。

3

我有一个类似的堆栈 - 烬,烬数据和rails-api与AMS。现在,我只是通过修改RESTAdapterajax方法,将标识(我存储在localStorage中)传递给标题(尽管您可以将其传递到查询字符串中)。

我最初的想法是避免重置每个请求的令牌。如果您特别担心被嗅探的令牌,则可能会更轻松地在服务器上定期重置该令牌(例如,10分钟)。然后,如果来自客户端的任何请求由于旧的令牌而失败,只需获取新的令牌(通过传递您的服务器在登录时提供的“重置令牌”)并重播初始请求。

至于放置令牌的位置,并没有真正的“Ember Way” - 我更喜欢将它传递到头中,因为将它传递给查询字符串可能会混淆缓存,并且更可能会记录在某处一路上。我肯定会避免将它传递给请求主体 - 这会违背烬数据期望的,我会想象的。