【问题标题】:ember-simple-auth: saving user's URL after ajax errorember-simple-auth:在 ajax 错误后保存用户的 URL
【发布时间】:2014-07-30 19:39:12
【问题描述】:

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

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

【问题讨论】:

    标签: ember.js ember-simple-auth


    【解决方案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

    【讨论】:

    • 感谢您的回复!并且不应该将会话中的最后一个转换保存为authenticated-route-mixin的一部分的逻辑吗?我想知道最后一次转换到经过身份验证的路由,以便在成功登录后重试。
    • 该功能实际上是库的一部分,但不适用于会话过期的情况。也很难检测到会话过期的情况,例如401 可能有不同的原因,例如用户试图做某事。他们不被允许。
    猜你喜欢
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多