Ember 身份验证最佳实践?

Posted

技术标签:

【中文标题】Ember 身份验证最佳实践?【英文标题】:Ember authentication best practices? 【发布时间】:2013-01-17 02:38:06 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

Client Side Authentication Part I Client Side Authentication Part II

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

有道理。

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

您可以在路由上添加一个enter 挂钩,这大致相当于一个 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 属性。

【讨论】:

我标记为接受,因为这让我走上了正轨。您能否详细说明您所做的评论:“有道理。我们使用 cookie-auth 并通过调用 /api/me 获取当前用户配置文件,但两者都应该工作。”什么是 cookie 身份验证?登录后还用token认证,把token存入cookie吗? 当然 - 猜测“cookie-auth”并不是一个真正的东西。我的意思是我们正在使用 rails cookie-store 进行会话。我们的 API 期望用户有一个有效的会话,并在 /api/me 被请求时返回 current_user。 快速说明,但您提到的“enter”钩子现在已弃用,取而代之的是“激活”(以及相应的“deactivate”) 如果 ember 应用程序认为它已通过身份验证但事实并非如此(例如服务器已过期会话密钥)怎么办?它如何检测到这种状态并重定向回登录表单? @adamsmith 这是个好问题。对我们来说不是问题,但我可以看到它可能是怎样的。理想情况下,您的 API 将在下次进行 API 调用时返回 HTTP 403。然后自定义您的 ember-data 适配器来处理这种情况并修改您的应用程序控制器的 isAuthenticated 属性。【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

太好了,谢谢何塞普。我会在本周的某个时候努力完成这项工作。 非常感谢您对 ActiveRecord 支持的非常有用的贡献。【参考方案4】:

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

以上是关于Ember 身份验证最佳实践?的主要内容,如果未能解决你的问题,请参考以下文章

平均堆栈身份验证 - 最佳实践

Vaadin 身份验证最佳实践

移动设备的最佳实践身份验证

Web API 身份验证最佳实践

管理身份验证令牌的最佳实践

实施客户端-服务器身份验证的最佳实践