更新:如 @DustMason 在他的回答中所说,请查看很棒的 embercasts 以了解最佳实践的身份验证。
为了完全将视图(Ember 应用)与服务器(Rails 应用)分离,我想使用令牌身份验证。我可能会在 Rails 服务器上使用 Devise。
有道理。
我需要像 Ember 应用中的 before_filter 等效物一样的东西,在其中可以检查当前用户是否存在以及该用户是否设置了身份验证令牌。
您可以在路由上添加一个 enter
hook,这大致相当于 before_filter。但不确定这是检查授权令牌的最佳位置。
Rails 服务器将在每次调用时返回当前的身份验证令牌。
有道理。我们使用 cookie-auth 并通过调用 /api/me
获取当前用户配置文件,但两者都可以使用。
如果它返回空身份验证令牌,则 Ember 应用程序应检测到此并转换为未经身份验证的状态,重定向到登录视图。
这种方法的问题在于(与 rails 不同),它不容易“保护”对特定 ember 路由的访问。无论如何,用户始终可以打开 JS 控制台并输入他们想要的任何状态。因此,不要考虑“只有经过身份验证的用户才能进入此状态”,而是考虑“如果未经身份验证的用户以某种方式导航到此路由会发生什么”
我怀疑我应该使用 Ember 状态机来解决这个问题,但我不确定该如何继续。有人解决了这个问题吗?
我们的身份验证需求非常简单,因此我们没有找到使用状态机的必要性。相反,我们在 ApplicationController 上拥有一个 isAuthenticated
属性。当用户未经身份验证时,我们在 application.hbs
中使用此属性将主视图替换为登录表单。
{{if isAuthenticated}}
{{render "topnav"}}
{{outlet}}
{{else}}
{{render "login"}}
{{/if}}
从ApplicationRoute中,我们获取用户配置文件:
App.ApplicationRoute = Ember.Route.extend({
model: function() {
var profiles;
profiles = App.Profile.find({ alias: 'me' });
profiles.on("didLoad", function() {
return profiles.resolve(profiles.get("firstObject"));
});
return profiles;
}
});
然后我们的ApplicationController根据返回的配置文件计算其isAuthenticated属性。
HTTP 403
。然后,定制您的 ember-data 适配器以处理此情况,并修改您的应用程序控制器的isAuthenticated
属性。 - Mike GrassottiisAuthenticated
?这都包含在浏览器中,这意味着用户很容易搞乱它。即使有中级的JavaScript经验,你也可以将其更改为“true”。在客户端运行身份验证逻辑甚至不应该被讨论,这是不可取的。 - Marco Prins