Angular 2 ADAL 令牌刷新,用于隐式流(使用 "adal-angular4")
Angular 2 ADAL token refresh, for implicit flow (using "adal-angular4")
似乎没有实用的方法来刷新隐式流中的令牌。
有没有人能够做到这一点? MS 文档建议在 Iframe 中进行刷新,寻找有关在 adal ng2 或 adal js 中调用哪些方法的建议!!!
编辑:
我正在使用这个库
https://github.com/benbaran/adal-angular4
编辑:不要使用上述库,它是真正的 POS
使用 implicit flow 您没有刷新当前令牌,您需要获取一个新令牌。
以下是我在我的应用程序中的处理方式:
我正在使用 oidc-client-js (not adal js
) that talks to IdentityServer. I have a token lifetime like 20 minutes. So in order to keep client authenticated for more than 20 minutes the new token has to be requested at some point. In order to do so I am checking if user is idle and when he is not, etc. based on the logic the new token can be obtained form the IdentityServer using signinSilent and automaticSilentRenew events. Refresh happening with iframe as it implemented in oidc-client-js。
更新:
通过查看 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-example 将其用作 home.component.ts
中的 this.service.acquireToken(...)
您无需明确执行任何操作即可更新 ADAL js 和 angular 上的令牌。 ADAL js 会自动拦截 REST 调用,如果必要的令牌不存在或即将过期,它将在后台主动更新令牌。这一切对您来说都是透明的,但无需在单页应用程序中使用刷新令牌;表示与 Azure AD 的会话的工件是在身份验证时发出的 cookie。 ADAL JS 使用隐藏的 iframe 来驱动无 UX 身份验证,该身份验证利用该 cookie 的存在通过隐式流从 Azure AD 获取新令牌。
我还在我的 Angular 5 应用程序中实现了 ADAL js,并通过以下方式实现了它:
用户使用 AD 进行身份验证并获得具有生命周期(在我的情况下为 60 分钟)的访问令牌。该令牌缓存在浏览器中。每次触发对后端的请求时,都会从缓存中获取令牌并将其发送到后端。
然后,还有另一个名为 expireOffsetSeconds
的参数(在 Adal 配置的前端定义)。对我来说它设置为 600(=10 分钟)。
这意味着,从第 1 分钟到第 49 分钟,它从缓存中获取令牌。在最后 10 分钟内,它会向 AD 发出新请求以更新令牌。
因此,保证了用户不必每隔一小时重新登录一次。但是如果不活动,ADAL 会自动使用户会话失效。
任何 feedback/improvements 欢迎 :)
似乎没有实用的方法来刷新隐式流中的令牌。 有没有人能够做到这一点? MS 文档建议在 Iframe 中进行刷新,寻找有关在 adal ng2 或 adal js 中调用哪些方法的建议!!!
编辑: 我正在使用这个库 https://github.com/benbaran/adal-angular4
编辑:不要使用上述库,它是真正的 POS
使用 implicit flow 您没有刷新当前令牌,您需要获取一个新令牌。
以下是我在我的应用程序中的处理方式:
我正在使用 oidc-client-js (not adal js
) that talks to IdentityServer. I have a token lifetime like 20 minutes. So in order to keep client authenticated for more than 20 minutes the new token has to be requested at some point. In order to do so I am checking if user is idle and when he is not, etc. based on the logic the new token can be obtained form the IdentityServer using signinSilent and automaticSilentRenew events. Refresh happening with iframe as it implemented in oidc-client-js。
更新:
通过查看 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-example 将其用作 home.component.ts
this.service.acquireToken(...)
您无需明确执行任何操作即可更新 ADAL js 和 angular 上的令牌。 ADAL js 会自动拦截 REST 调用,如果必要的令牌不存在或即将过期,它将在后台主动更新令牌。这一切对您来说都是透明的,但无需在单页应用程序中使用刷新令牌;表示与 Azure AD 的会话的工件是在身份验证时发出的 cookie。 ADAL JS 使用隐藏的 iframe 来驱动无 UX 身份验证,该身份验证利用该 cookie 的存在通过隐式流从 Azure AD 获取新令牌。
我还在我的 Angular 5 应用程序中实现了 ADAL js,并通过以下方式实现了它:
用户使用 AD 进行身份验证并获得具有生命周期(在我的情况下为 60 分钟)的访问令牌。该令牌缓存在浏览器中。每次触发对后端的请求时,都会从缓存中获取令牌并将其发送到后端。
然后,还有另一个名为 expireOffsetSeconds
的参数(在 Adal 配置的前端定义)。对我来说它设置为 600(=10 分钟)。
这意味着,从第 1 分钟到第 49 分钟,它从缓存中获取令牌。在最后 10 分钟内,它会向 AD 发出新请求以更新令牌。
因此,保证了用户不必每隔一小时重新登录一次。但是如果不活动,ADAL 会自动使用户会话失效。
任何 feedback/improvements 欢迎 :)