能否使用MSAL.js获取刷新令牌?

16

我希望与Microsoft Outlook集成。我能够使用MSAL.js登录并获取访问令牌,但我无法获取刷新令牌。是否有方法可以实现?

3个回答

11

假设您正在使用MSAL.js (https://github.com/AzureAD/microsoft-authentication-library-for-js),那么您正在使用隐式流进行身份验证和授权。

隐式流不支持刷新令牌,但您可以静默地请求新的令牌。这类似于您最初请求令牌(ID或访问令牌)的方式。不幸的是,我发现MSAL.js没有透明地完成这项操作,因此我需要在代码中检测过期的令牌并请求新的令牌。您可以在此处了解更多有关刷新令牌的信息。

或者,如果您正在实现的内容允许您使用其他MSAL库之一(例如.NET库),则可以使用另一种明确支持刷新令牌的OAuth流程。


1
谢谢你的回答@nbrowne。您可以检查一下您回答中的这部分内容吗:“不幸的是,我没有发现MSAL.js可以透明地做到这一点…” - spottedmahn

3
我在MSAL.js文档中找不到任何答案,但是这段源代码注释表明您可以通过仅将clientId作为范围传递给acquireTokenSilent来手动更新令牌。

要更新idToken,请在身份验证参数中仅传递clientId作为范围


@AaronFriedman 这个评论是正确的,但我不得不设置一些东西来手动定时执行此操作或监听浏览器的在线事件。 - Sandy Chapman
当您手动设置时,是否也会检索访问令牌? - afriedman111
1
是的,我进行了双重令牌获取。首先使用客户端ID进行静默令牌获取,然后再使用常规范围进行另一个令牌获取。 - Sandy Chapman
1
它起作用了。我的问题在于我使用了npm包@azure/msal-angular。我切换到msal包,然后重新实现了我的项目的身份验证。在实现了msal包发布版本的解决方案之后,我成功地让静默id_token更新工作了。谢谢! - afriedman111
@AaronFriedman 我在使用React msal库时遇到了非常类似的问题。使用标准的msal库比处理这些问题要容易得多。很高兴听到你已经解决了它。 - Sandy Chapman
显示剩余4条评论

3
我使用的是msal v1.4.0。
我从存储中删除了2个密钥(见图片),然后再次调用acquireTokenSilent以获取新的访问令牌。 enter image description here 删除这两个密钥的代码如下:
const keys = Object.keys(sessionStorage).filter(x => x.indexOf('authority') > 0)
keys.forEach(x => sessionStorage.removeItem(x))

可以将 sessionStorage 替换为 localStorage - PeterM
在1.4.2版本中,这往往会偶尔抛出“cannot_parse_cache”错误。 - PeterM
我对1.4.2没有问题。您可以尝试从Microsoft的https://github.com/Azure-Samples/active-directory-b2c-javascript-msal-singlepageapp下载示例应用程序。将index.html中的库更改为1.4.2(现在仍然是1.4.0),然后添加代码以在调用acquireTokenSilent()之前删除getTokenPopup()中的2个密钥。 - qnguyen
@PeterMark 这个问题已经在1.4.3版本中得到修复了! - sandrooco
嘿,你能解释一下如何调用acquireTokenSilent方法吗?我很难找到如何调用它。 - yesman
1
@yesman 创建一个实例:const myMSALObj = new Msal.UserAgentApplication(msalConfig) 然后 myMSALObj.acquireTokenSilent(request)。您可以在 https://github.com/Azure-Samples/active-directory-b2c-javascript-msal-singlepageapp 查看示例项目。在 JavaScriptSPA 文件夹中有弹出窗口和重定向的示例(authPopup.js 和 authRedirect.js)。 - qnguyen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接