48

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

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

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

我怀疑我应该为此使用 Ember 状态机,但我不确定如何继续。有人解决过这个问题吗?

4

5 回答 5

51

更新:就像@DustMason 在他的回答中所说,查看令人敬畏的embercasts以获取身份验证最佳实践。

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

说得通。

我需要在 Ember 应用程序中使用类似 before_filter 的东西,我可以在其中检查是否存在当前用户以及该用户是否设置了身份验证令牌。

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

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

说得通。我们使用 cookie-auth 并通过调用获取当前用户配置文件,/api/me但两者都应该工作。

如果它返回一个空的身份验证令牌,Ember 应用程序应该检测到这一点并转换到未经身份验证的状态,重定向到登录视图。

关于这种方法的事情是(与 rails 不同)“保护”对特定 ember 路线的访问并不容易。并且无论用户总是可以弹出打开的 JS 控制台并进入他们想要的任何状态。因此,与其认为“用户只有通过身份验证才能进入这种状态”,不如考虑“如果未经身份验证的用户以某种方式导航到这条路线怎么办”

我怀疑我应该为此使用 Ember 状态机,但我不确定如何继续。有人解决过这个问题吗?

我们的身份验证需求非常简单,因此我们还没有发现需要状态机。相反,我们isAuthenticated在 ApplicationController 上有一个属性。当用户未通过身份验证时,我们使用此属性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 属性。

于 2013-02-01T19:27:31.000 回答
19

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

同一作者还提供了一个使用 Devise on Rails 的演示和教程。

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

于 2013-04-12T19:55:26.270 回答
12

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

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

于 2013-12-04T23:02:04.403 回答
4

在我看来,新发布的 Ember 异步路由器让设置一个不错的身份验证流程变得更加容易!查看http://www.embercasts.com/上的两部分系列以获得一个很好的例子

于 2013-06-30T20:35:44.090 回答
3

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

于 2013-04-24T13:31:53.897 回答