Ember身份验证最佳做法?

问题描述 投票:48回答:5

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

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

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

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

ember.js
5个回答
51
投票

更新:就像@DustMason在他的回答中所说的那样,查看用于身份验证最佳实践的令人敬畏的强制措施。

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

说得通。

我需要类似于Ember app中的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属性。


19
投票

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

此外,同一作者还提供了Devise on Rails的演示和教程

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


12
投票

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

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


4
投票

在我看来,新发布的Ember异步路由器使得设置一个很好的auth流程更加容易! 查看http://www.embercasts.com/上的两部分系列文章,以获得一个很好的例子


3
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.