【问题标题】:Angular 2 ADAL token refresh, for implicit flow (using "adal-angular4")Angular 2 ADAL 令牌刷新,用于隐式流(使用“adal-angular4”)
【发布时间】:2018-01-13 00:45:21
【问题描述】:

似乎没有在隐式流中刷新令牌的实用方法。 有没有人能够做到这一点? MS 文档建议在 Iframe 中进行刷新,寻找有关在 adal ng2 或 adal js 中调用什么方法的建议!!!

编辑: 我正在使用这个库 https://github.com/benbaran/adal-angular4

编辑:不要使用上述库,它是一个真正的 POS

【问题讨论】:

  • 我刚刚在回答中解释了我如何使用oidc-client-jsIdentityServer 处理类似的情况,我认为在你的情况下这将是完全相同的主体。你到底在用什么adal 库?
  • @LastTribunal - 你最后切换库了吗?我们不得不“破解”源代码以使其调用我们的 API,但现在任何 API 调用都会使整个应用程序重新加载到 iframe sigh
  • @MichaelHarper,我不得不扔掉那些 adal4 垃圾并建立自己的。使用 adal2 作为指导。我吸取了教训,对 github 上的所有东西都持保留态度
  • @LastTribunal 我想我必须做类似的事情

标签: angular jwt adal


【解决方案1】:

使用implicit flow 不是在刷新当前令牌,您需要获取一个新令牌。

这是我在应用程序中处理该问题的方式:

我正在使用与IdentityServer 对话的oidc-client-js(不是adal js)。我的令牌生命周期为 20 分钟。因此,为了让客户端经过身份验证超过 20 分钟,必须在某个时候请求新令牌。为了做到这一点,我正在检查用户是否是idle,而当他不是时,等等。基于逻辑,可以使用signinSilentautomaticSilentRenew 事件从IdentityServer 获取新令牌。在 oidc-client-js 中实现的 iframe 发生刷新。

更新:

通过查看adal-angular4 source,您需要致电acquireToken 以更新令牌。根据文档:

/**
* Acquire token from cache if not expired and available. Acquires token from iframe if expired.
* @param {string}   resource  ResourceUri identifying the target resource
* @param {requestCallback} callback
*/
acquireToken(resource: string, callback: (message: string, token: string) => any): void;

您可以使用acquireToken 使用该示例来玩https://github.com/benbaran/adal-angular4-examplehome.component.ts 中将其用作this.service.acquireToken(...)

【讨论】:

  • 谢谢兄弟。但正如 Vittorio 所提到的,在隐式流程中,这应该自动发生,因为 adaljs 会拦截所有 HTTP 调用。您认为我使用的库仅包装 adal.js 会干扰正常流程吗?
  • 此外,还不清楚为什么需要指定资源 url,因为库已经知道它,因为它能够在原始登录期间首先使用这个 uri 谢谢再次寻求您的帮助!
【解决方案2】:

您无需明确执行任何操作来更新 ADAL js 和 Angular 上的令牌。 ADAL js 自动拦截 REST 调用,如果必要的令牌不存在或即将到期,它将在后台主动更新令牌。这对你来说都是透明的,但是在单页应用程序中不需要使用刷新令牌;表示与 Azure AD 的会话的工件是身份验证时发出的 cookie。 ADAL JS 使用隐藏的 iframe 来驱动无 UX 身份验证,该身份验证利用该 cookie 的存在通过隐式流从 Azure AD 获取新令牌。

【讨论】:

  • 我没有得到任何透明的续订,也许我使用的库是 fubar
  • 查看此示例:azure.microsoft.com/en-us/resources/samples/…,尤其是端点初始化。只要将 Web API URL 保存在那里,您就应该获得自动续订。小心。有时将 API 托管在与应用本身相同的域中可能会发生故障。
  • 我认为问题出在 $httpProvider,Angular 2 中不存在。
  • 对不起,我忘了你在看 Angular 2。ADAL js 是针对 Angular 1 的——如果你在 Angular 2 上,你需要使用 ADAL js 的下层并自己调用 acquiretokensilent
  • 很抱歉看到您的经历。不幸的是,您的目标是我们没有第一方 SDK 的平台。正在讨论下一个目标堆栈。你说得对,ADAL JS 没有acquiretokensilent;这个想法是 ADAL JS 中的每个获取令牌都是静默的,交互方法是登录 - 在 C# 版本中它是不同的,因此我的错误。请参阅github.com/Azure-Samples/… 以获取使用 ADAL JS 而没有 Angular 1 的 SPA 示例,这应该可以帮助您模拟 $http 拦截器逻辑
【解决方案3】:

我还在我的 Angular 5 应用程序中实现了 ADAL js,并通过以下方式实现了它:

用户通过 AD 进行身份验证并获得一个具有生命周期的访问令牌(在我的情况下为 60 分钟)。该令牌缓存在浏览器中。每次向后端发出请求时,都会从缓存中获取令牌并将其发送到后端。

然后,还有一个名为 expireOffsetSeconds 的参数(在 Adal 配置的前端定义)。对我来说,它设置为 600(=10 分钟)。 这意味着,从第 1 分钟到第 49 分钟,它从缓存中获取令牌。在最后 10 分钟内,它会向 AD 发出新请求以更新令牌。

因此,确保用户不必每隔一小时重新登录一次。但是在不活动的情况下,用户的会话会自动被 ADAL 失效。

欢迎任何反馈/改进:)

【讨论】:

  • 你是使用acquireToken刷新令牌还是自动处理?
  • 我没有积极使用它。但是,我使用的 Angular 包装器实际上是调用acquireToken 来刷新令牌
  • 使用嵌套控制器并设置 $interval 来强制刷新令牌是我过去为处理此问题所做的。只需在间隔的活动状态下连接即可登录/退出状态。
猜你喜欢
  • 1970-01-01
  • 2015-12-18
  • 2019-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多