Ember 认证最佳实践?

48

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

以下是我的一些想法:

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

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

5个回答

51

更新:如 @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属性。


2
我标记为已接受,因为这让我走上了正确的轨道。您能详细说明一下您所做的评论吗:“有道理。我们使用cookie-auth并通过调用/api/me获取当前用户配置文件,但两者都可以使用。”什么是cookie-auth?您是否仍然使用token身份验证并在登录后将令牌存储在cookie中? - Sean Rucker
1
快速提醒,但是你提到的“enter”钩子现在已经被弃用,取而代之的是“activate”(和相应的“deactivate”)。 - Kevin Ansfield
2
如果Ember应用程序认为它已经通过身份验证但实际上没有(例如,服务器已过期会话密钥),该怎么办?它如何检测到这种状态并重定向回登录表单? - adam smith
2
@adamsmith 这是一个好问题。对我们来说不是问题,但我能理解这可能会成为问题。理想情况下,您的 API 将会在下一次 API 调用时返回 HTTP 403。然后,定制您的 ember-data 适配器以处理此情况,并修改您的应用程序控制器的 isAuthenticated 属性。 - Mike Grassotti
你如何在Ember应用程序中使用isAuthenticated?这都包含在浏览器中,这意味着用户很容易搞乱它。即使有中级的JavaScript经验,你也可以将其更改为“true”。在客户端运行身份验证逻辑甚至不应该被讨论,这是不可取的。 - Marco Prins
显示剩余4条评论

19

我建议使用ember-auth。在我看来,它实现了所有必要的功能,并且运行非常良好。

此外,该作者还有一个基于Devise on Rails的演示和教程

我还使用了基于Ember-auth的基本Ember应用程序,其中使用Devise令牌验证以及Google和LinkedIn的示例Oauth。您可以在这里找到它,并在https://starter-app.herokuapp.com上查看其实时演示。


12

我最近从自定义认证系统改为使用ember-simple-auth,发现它非常容易与我的应用程序集成。它满足了所有OP的要求,并且还具有内置的刷新令牌支持。

它们有一个非常好的API和一组出色的示例。对于任何对基于令牌的身份验证感兴趣的人都应该去看看。


4

我认为,新发布的Ember异步路由使得设置良好的身份验证流程更加容易!请查看http://www.embercasts.com/上的两部分系列,以获取一个很好的例子。


3

Josep的示例应用非常好。我复制了他的代码库来展示如何使用ActiveRecord而不是mongoid,并启用Devise confirmable模块。你可以在这里找到它。这个代码库是从零开始重建的,而不是fork,因为我想强迫自己经历所有步骤才能使其正常工作。如果我添加了一个fork以获取必要的更改并使其正常运行,我将更新此答案。


太好了,谢谢Josep。我会在本周某个时间完成它。 - jhosteny
非常感谢您对ActiveRecord支持所做出的非常有用的贡献。 - joscas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接