如何在ember-simple-auth会话中从响应头更新JWT令牌

时间:2017-05-26 20:21:28

标签: ember.js ember-simple-auth

我正在使用ember-simple-auth& ember-simple-auth-token用于维护Ember上的会话。我不想使用刷新令牌方法,而是希望在每个服务请求的响应头中接收新的jwt令牌。

每次收到服务器的响应时,如何通过更新会话中的jwt令牌来保持会话的活动状态?

1 个答案:

答案 0 :(得分:1)

可以这样做,但需要延长ember-simple-authember-simple-auth-token。不建议使用您的方法,访问令牌和刷新令牌绝对是首选方法。它也可以更好地扩展,因为您的资源服务器不需要身份验证,只需要授权和验证令牌。它还为每个请求生成一个新令牌增加了一些开销。虽然我不推荐这门课程,但这是如何做到的:

正如您所发现的,您无法直接更新会话,但如果您深入了解源代码,您会发现ember-simple-auth使用event进行更新。但是,此事件仅在您覆盖/自定义authenticator时才有效。可能是ember-simple-auth-token的{​​{1}}。如果您查看其身份验证器,您可以看到如何update the session的示例。

因此,我建议您创建自己的自定义JWT令牌身份验证器,以扩展authenticators/jwt.js。它可能会添加一个更新ember-simple-auth-token的方法,或者更好地处理包含新访问令牌的原始请求标头。

完成后,您可以选择。你可以覆盖自己的session并从那里自己调用该函数,或者更好的选择是覆盖adapter的{​​{1}} mixin。

如果您覆盖ember-simple-auth data-adapter-mixin,这似乎是最佳起点:handleResponse。如果您覆盖该功能,则应该可以访问原始API响应,您可以从中调用更新会话功能。

正如您所看到的,这不是一个微不足道的变化。这绝对违背了这些图书馆最初设计的内容,但如果你付出了很多努力,它应该是可能的。

OP评论的更新
我之前实际上实现了这两个要求:“1)在预先配置的空闲时间之后有会话超时.2)允许某些用户代理并立即切换登录用户的上下文”。事实证明,使用刷新令牌模型实际上很容易实现。

要支持#1,刷新令牌到期时间应设置为注销前的空闲时间长度。例如如果刷新令牌设置为在30分钟后过期,则访问令牌在5分钟后到期。客户端将根据余地每隔约5分钟自动获取新的访问令牌(以及可选的刷新令牌)。但是,如果用户离开页面超过30分钟,刷新令牌将过期,他们将需要重新进行身份验证。

对于#2,不幸的是,它确实需要覆盖ember-simple-auth才能工作,但它相对容易,我已经实现了。基本上,您创建一个自定义身份验证器,该身份验证器具有一个附加功能,用于交换和访问具有更新上下文/状态的新令牌。请参阅下面的实施:

data-adapter-mixin覆盖了身份验证器:

ember-simple-auth-token

触发令牌交换的行动:

ember-simple-auth-token

显然需要扩展后端以接受刷新令牌端点上的其他参数,允许用户切换角色(如果已授权)。