Ember身份验证最佳做法?

时间:2013-02-01 17:49:33

标签: ember.js

有没有人有经验在pre4中使用新路由器创建身份验证机制?

到目前为止,我的一些想法是:

  • 为了将视图(Ember app)与服务器(Rails应用程序)完全分开,我想使用令牌认证。我可能会在Rails服务器上使用Devise。
  • 我需要类似于Ember应用程序中的before_filter等效项,我可以检查是否有当前用户以及该用户是否设置了身份验证令牌。
  • Rails服务器将在每次调用时返回当前的身份验证令牌。如果它返回一个空的身份验证令牌,则Ember应用程序应检测到此并转换到未经身份验证的状态,重定向到登录视图。

我怀疑我应该使用Ember状态机,但我不知道如何继续。有人解决了这个问题吗?

5 个答案:

答案 0 :(得分:51)

更新:就像@DustMason在他的回答中所说,查看真棒embercasts进行身份验证最佳实践。

  

为了将视图(Ember app)与服务器(Rails应用程序)完全分开,我想使用令牌认证。我可能会在Rails服务器上使用Devise。

有道理。

  

我需要类似于Ember应用程序中的before_filter等效项,我可以检查是否有当前用户以及该用户是否设置了身份验证令牌。

您可以在路由上添加enter挂钩,这大致相当于before_filter。但不确定这是检查身份验证令牌的最佳位置。

  

Rails服务器将在每次调用时返回当前的身份验证令牌。

有道理。我们使用cookie-auth并通过调用/api/me来获取当前用户配置文件,但两者都应该有效。

  

如果它返回一个空的身份验证令牌,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属性。

答案 1 :(得分:19)

我建议使用ember-auth。它实现了所有必需的功能,并且在我看来效果很好。

同一作者也有一个demo and tutorial与Devise on Rails。

我还实现了一个基于Ember-auth的基本Ember应用程序,带有Devise令牌认证,以及可以找到here的Google和LinkedIn示例Oauth,并且在此处生效:https://starter-app.herokuapp.com

答案 2 :(得分:12)

我最近从一个定制的auth系统改为使用ember-simple-auth,发现很容易与我的应用程序集成。它满足所有OP要求,并且内置了对刷新令牌的支持。

他们有一个非常好的API和一组很好的例子。任何对基于令牌的身份验证感兴趣的人都应该检查出来。

答案 3 :(得分:4)

新发布的Ember异步路由器在我看来更容易设置好的auth流程!在http://www.embercasts.com/上查看由两部分组成的系列作为一个很好的例子

答案 4 :(得分:3)

Josep的example app非常好。我制作了他的回购副本,以展示如何使用ActiveRecord而不是mongoid,并启用Devise可确认模块。你可以找到它here。这个回购从头开始重建,而不是分叉,因为我想强迫自己完成所有步骤以使其工作。如果我添加一个带有必要更改的分支以使其工作,我将更新此答案。