1

我在我的 ember-js 应用程序中应用了 ember-simple-auth-0.6.4.js 并且有一种情况,这很常见。这是步骤的顺序。

  1. 用户在应用程序中进行身份验证(我为此使用自定义身份验证器)。所以会话变得有效。
  2. 大约 20 分钟不活动后,后端会话变得无效。
  3. 用户转到一条路线(从 AuthenticatedRouteMixin 派生),并且由于客户端应用程序中的 ember 会话仍然有效->“会话已验证”检查通过。
  4. 然后调用路由模型钩子,在其中我尝试使用 ajax 请求从后端加载一些数据 - 我得到 401 未经授权的响应,因为后端会话无效。
  5. 在 401 错误响应客户端的应用程序会话无效后 - 然后调用 application-route-mixin 中定义的 sessionInvalidationSucceeded() 处理程序,其中位置更改:window.location.replace(Configuration.applicationRootUrl);

问题是:如果在 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),并且发生错误的路由 - 存储到尝试转换,因此在成功登录后,用户将被重定向到他停止工作的地方。

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

4

1 回答 1

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

于 2014-07-31T07:51:52.827 回答