7

语境:

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

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

问题:

我在每个请求和响应中将身份验证令牌放在哪里?

它应该是请求和响应中每个对象的 JSON 的一部分吗?如果是这样,令牌放在现有对象的 JSON 结构中的什么位置(与身份验证无关)?

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

人们最终可能希望在新的 Ember Guides Cookbook 中找到“The Ember Way”是什么?

更多背景:

我已经熟悉以下链接:

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

除了需要通过 Ember-Data 在响应中将新令牌传递回客户端之外,假设我的客户端代码在其他方面类似于 GitHub 上的 @machty Embercast 示例:https ://github.com/embercasts/authentication -part-2/blob/master/public/js/app.js

非常感谢!

4

2 回答 2

3

我有一个类似的堆栈——带有 AMS 的 ember、ember-data 和 rails-api。现在,我只是通过修改RESTAdapter'ajax方法在标头中传递身份验证令牌(我存储在 localStorage 中)(尽管您可以在查询字符串中传递它)。

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

至于将令牌放在哪里,实际上并没有“Ember Way” - 我更喜欢在标题中传递它,因为在查询字符串中传递它可能会混淆缓存,并且更有可能在途中记录在某处。我肯定会避免在请求正文中传递它 - 我想这会违背 ember-data 的预期。

于 2013-09-25T17:40:32.847 回答
2

我已经构建了类似的东西,尽管除非用户注销,否则我不会重置令牌。

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

于 2013-09-23T20:38:07.307 回答