ember-simple-auth:在ajax错误后保存用户的URL

时间:2014-07-30 19:39:12

标签: ember.js ember-simple-auth

我在我的ember-js应用程序中应用了ember-simple-auth-0.6.4.js,并且有一个案例,这很常见。这是一系列步骤。

  1. 用户在应用程序中进行身份验证(我使用自定义身份验证器)。因此会话变得有效。
  2. 在不活动约20分钟后,后端会话无效。
  3. 用户转到路由(从AuthenticatedRouteMixin派生),并且由于客户端应用中的ember会话仍然有效 - > "会话认证"检查通行证。
  4. 然后调用路由模型钩子,其中我尝试使用ajax请求从后端加载一些数据 - 我得到401未经授权的响应,因为后端会话无效。
  5. 401错误响应后,客户端的app会话无效 - 然后调用application-route-mixin中定义的sessionInvalidationSucceeded()处理程序,其中位置发生变化:window.location.replace(Configuration.applicationRootUrl);
  6. 问题是:如果在applicationRootUrl中定义的url - 在经过身份验证的路由下 - 登录页面将显示给用户,但在身份验证后用户再次转到applicationRootUrl,但不会转到最初发生ajax错误的页面。

    我的解决方案:

    • 在AuthenticatedRouteMixin beforeModel()钩子中我存储了最后一次转换:

      Configuration.beforeInvalidationTransition = transition;

    • 在ApplicationRouteMixin中,我重新定义了sessionInvalidatedSucceeded钩子:

      sessionInvalidationSucceeded: function() { if (Configuration.beforeInvalidationTransition) { this.get(Configuration.sessionPropertyName) .set('attemptedTransition',Configuration.beforeInvalidationTransition); } this.transitionTo(Configuration.authenticationRoute);

    因此,如果发生401错误,用户被重定向到登录页面(Configuration.authenticationRoute)和发生错误的路由 - 存储到attemptTransition,因此在成功登录后,用户将被重定向到他停止工作的地方。

    这个问题是否有意义还是有更优雅的解决方案?

1 个答案:

答案 0 :(得分:1)

您实际上可以在不使用Configuration.beforeInvalidationTransition的情况下立即在会话中存储最后一次转换。您也可以在访问令牌即将到期之前刷新,就像OAuth 2.0身份验证器那样(请参阅此处:https://github.com/simplabs/ember-simple-auth/blob/master/packages/ember-simple-auth-oauth2/lib/simple-auth-oauth2/authenticators/oauth2.js#L167