使用刷新令牌 adal azure AD 静默更新访问令牌

Posted

技术标签:

【中文标题】使用刷新令牌 adal azure AD 静默更新访问令牌【英文标题】:Silently update accesstoken using refreshtoken adal azureAD 【发布时间】:2018-12-20 12:33:08 【问题描述】:

环境

Angular 5 前端 使用 Adal-Angular 进行 AzureAD 身份验证

当前情景

    用户身份验证成功并获取访问/刷新令牌 一段时间后,访问令牌过期。 在后续请求中,用户被重定向回 Azure 登录页面,然后重定向回应用配置的主页。由于涉及重定向,用户将丢失当前页面上的所有工作。用户必须重新启动整个工作流程并再次返回原始请求页面。

要求

到期后,刷新应该在用户没有任何明确操作的情况下静默完成。令牌刷新完成后,用户将留在原处并继续工作。

代码

Adal.service.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 中获取它?)

欢迎对改进方法/设计/代码提出任何建议

【问题讨论】:

是的,如果可能的话,acquireAccessToken 应该通过 iframe 不可见地获取它。您能在 F12 工具的“网络”选项卡中看到这一点吗?只要用户与 Azure AD 有活动会话,您就应该能够获得新的访问令牌。 一旦客户端检测到令牌已过期,我就会被重定向到登录屏幕,然后浏览器会自动登录(可能是因为凭据已保存并设置为记住身份验证)。只是工作流程被打乱了 是的,ADAL.JS 应该在后台自动获取令牌,而无需重定向。您立即返回应用程序的原因是用户仍然与 Azure AD 有一个活动会话(请记住,它是一个单点登录系统)。 你解决了吗?我也有同样的问题 【参考方案1】:

在用户登录并且存在有效的会话 cookie 之前,ADAL 将更新已过期的令牌或即将过期的令牌。从用户的角度来看,这种更新发生在后端,只要存在与 AAD 的有效会话,他们就应该认为令牌从未真正过期。我认为在令牌过期之前或之后更新令牌没有太大区别,只要有可用的令牌可以提供给受保护的 API。

当用户登录时,AAD 会设置一个 cookie。只要该 cookie 有效,ADAL 就可以在需要时静默更新令牌。以编程方式,您可以调用aquireToken api 来更新令牌。

还要检查您是否在清单中将 oauth2AllowImplicitFlow 设置为 true。这可能会有所帮助:http://***.com/questions/29326918/adal-js-response-type-token-is-not-supported

【讨论】:

自动续订在adal.js 的哪个位置发生?没看到。只看到程序化 (acquireToken) 并使用令牌续订已过期。

以上是关于使用刷新令牌 adal azure AD 静默更新访问令牌的主要内容,如果未能解决你的问题,请参考以下文章

如何配置 Azure AD 访问令牌的过期时间(使用 ADAL)?

刷新的 OAuth2 令牌具有无效签名 (Azure AD OAuth2)

使用 Passport 和 passport-azure-ad 时没有刷新令牌

Azure AD 身份验证令牌未通过 Web api 授权

如何使用 Postman 获取 Azure AD 刷新令牌?

ADAL使用AcquireTokenAsync和现有JWT令牌续订令牌