angular - 使用 refreshtoken adal azureAD 静默更新 accesstoken
问题描述
环境
- Angular 5 前端
- 使用 Adal-Angular 的 AzureAD 身份验证
当前情景
- 用户身份验证成功并获取访问/刷新令牌
- 一段时间后,访问令牌过期。
- 在后续请求中,用户被重定向回 Azure 登录页面,然后重定向回应用配置的主页。由于涉及重定向,用户将丢失当前页面上的所有工作。用户必须重新启动整个工作流程并再次返回原始请求页面。
要求
到期后,刷新应该在用户没有任何显式操作的情况下静默完成。用户留在原处并在令牌刷新完成后继续工作。
代码
阿达尔服务.ts
public get accessToken() {
return this.context.getCachedToken(this.configService.getAdalConfig.clientId);
}
public get graphAccessToken() {
return sessionStorage[new AppConstants().User_Graph_Token];
}
public retrieveTokenForGraphAPI() {
this.context.acquireToken('https://graph.microsoft.com', function (error, id_token) {
if (error || !id_token) {
console.log('ADAL error occurred: ' + error);
} else {
// Store token in sessionStorage
sessionStorage[new AppConstants().User_Graph_Token] = id_token;
return;
}
}.bind(this)
);
}
OAuth.callback.component.ts
export class OAuthCallbackComponent implements OnInit {
ngOnInit() {
if (!this.adalService.userInfo) {
console.log('oauthCallBack::User info not found, redirecting to login');
this.router.navigate(['loginKey']);
} else {
if (!this.adalService.graphAccessToken) {
this.adalService.retrieveTokenForGraphAPI();
}
this.router.navigate([appConstants.App_Home_Page_URL]);
}
图代币消费者
在这个地方,它检测到令牌已过期,然后重定向到登录页面(接收缓存的参数)。重定向失去了应用程序的工作流上下文,从而妨碍了用户的工作
if (!this.adalService.isAuthenticated) {
this.adalService.login();
}
const bearer = this.adalService.graphAccessToken;
// Now hit graph client
const client = MicrosoftGraphClient.Client.init({
authProvider: (done) => {
done(null, bearer); //first parameter takes an error if you can't get an access token
}
});
让我知道是否需要任何其他配置/代码详细信息。
(是否应该在会话中明确保存令牌,我只调用“retrieveTokenForGraphAPI”,它可以根据需要从自己的缓存或 iframe 中获取它?)
欢迎任何有关改进方法/设计/代码的建议
解决方案
在用户登录并且存在有效的会话 cookie 之前,ADAL 将更新已过期的令牌或即将过期的令牌。从用户的角度来看,这种更新发生在后端,只要存在与 AAD 的有效会话,他们就应该认为令牌从未真正过期。我认为在令牌过期之前或之后更新令牌没有太大区别,只要有可用的令牌可以提供给受保护的 API。
当用户登录时,AAD 会设置一个 cookie。只要该 cookie 有效,ADAL 就可以在需要时静默更新令牌。以编程方式,您可以调用aquireToken
api 来更新令牌。
还要检查您是否在清单中将 oauth2AllowImplicitFlow 设置为 true。这可能会有所帮助:http ://stackoverflow.com/questions/29326918/adal-js-response-type-token-is-not-supported
推荐阅读
- arcgis-runtime - ArcGIS 运行时:SceneView 加载 tif 文件不起作用
- c# - 如何在问题主体的上下文中对 2 个列表进行性能迭代?
- mariadb - 计算 MariaDB 10.4 中 json 列的数组中有多少行具有嵌套值
- android - 在 null (Firebase) Flutter 上调用方法
- python - 保存 matplotlib 图的特定部分
- java - 如何制作特定于配置文件的 bootstrap.yml?
- python - 如何使用 pandas 执行 mongodB $lookup 和 $unwind?
- spring - 将 ArrayList 类型转换为 ResponseEntity
- python - 如何生成 0 到 31 之间的随机整数对?
- java - 我想要一个标签是 x 轴和 y 轴是字符串的图表