我正在使用ember-simple-auth& ember-simple-auth-token用于维护Ember上的会话。我不想使用刷新令牌方法,而是希望在每个服务请求的响应头中接收新的jwt令牌。
每次收到服务器的响应时,如何通过更新会话中的jwt令牌来保持会话的活动状态?
答案 0 :(得分:1)
可以这样做,但需要延长ember-simple-auth
和ember-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
显然需要扩展后端以接受刷新令牌端点上的其他参数,允许用户切换角色(如果已授权)。