获取由MSAL.JS生成的localStorage中的访问令牌,并将其放入Axios

0sgqnhkj  于 2023-03-02  发布在  iOS
关注(0)|答案(2)|浏览(144)

你好,
我正在尝试在应用程序中实现MSAL.js。基本上,我能够实现msal.js并使用AD中的电子邮件登录。我还配置了msal,以便将tokenidaccessToken保存在localStorage
accessToken可以在我的后端工作,因为我使用Postman软件测试了它。但在我的应用中,我不知道如何获取它并将其放入我的Axios标头中,因为localStorage中的key显示如下:

在对象的localStorage中有一个Key

{"authority":"https://login.microsoftonline.com/TENANTID/","clientId":"CLIENT_ID","scopes":"CLIENT_ID","homeAccountIdentifier":"SOME_HASH"}

值为:

accessToken: 'TOKEN_HASH_HERE'
idToken: 'TOKEN_HASH_HERE'
expiresIn: 'TOKEN_HASH_HERE'
homeAccountIdentifier: 'TOKEN_HASH_HERE'

我需要获取访问令牌,以便能够将其放入axios标头中,如下所示:

axios.defaults.headers.common['Authorization'] = `Bearer ${accessTokenFromMsal}`

先谢谢你。

anhgbhbe

anhgbhbe1#

如果您在项目中使用msal包,您可以从MSAL Azure AD的Github Repo访问此samples
看一看line 70上的AuthProvider.js


基本上,你可以在if(tokenResponse)语句后面加上一个console.log(tokenResponse),如下所示:

if(tokenResponse){
    console.log(tokenResponse)
}

在你的控制台日志中,你会看到令牌响应的细节,这很棘手,但是你正在寻找的accessToken的参数名是idToken.rawIdToken,而不是accessToken(因为据我所知,访问令牌是针对ms图的请求令牌)。
然后,您可以在这里设置一个项目到您的localStorage。

if (tokenResponse) {
localStorage.setItem("webApiAccessToken", tokenResponse.idToken.rawIdToken)
...
}

所以你可以把它放在你的请求头上。就像你的case一样,使用axios

axios.defaults.headers.common['Authorization'] = `Bearer ${localStorage.getItem('webApiAccessToken')}`

注意:无论用户何时单击logout方法,都要确保清除localStorage中的webApiAccessToken
希望对你有帮助。

dsf9zpds

dsf9zpds2#

以下是如何使用@azure/msal-browser npm包从本地存储获取访问令牌的示例。所有这些操作的关键是publicClientApplication.getAllAccounts()提供了本地存储中的ID令牌的直接访问权限,以允许您创建长localStorage项密钥。

let account = publicClientApplication.getAllAccounts()[0];
    console.log(`${account.homeAccountId}-login.microsoftonline.com-accesstoken-${AuthConfig.getClientId()}-${AuthConfig.getTenantId()}-${ACCESS_TOKEN_FULLY_QUALIFIED_SCOPE}---`);

应用程序中应该包含的所有变量。publicClientApplication来自一个您应该拥有的单例变量,然后客户端ID、租户ID和作用域都是OAuth的核心项,您应该已经知道了。
这似乎是直接访问localStorage的唯一方法。我已经深入研究了msal库,访问方法是受保护的,所以尽管这可能会在补丁或小的包更新中中断,但这段代码实际上非常重要。因为msal没有充分利用甚至完全滥用该高速缓存,比如在调用acquireTokenSilent和过度调用openid时给你过时的id令牌-配置,即使该高速缓存中已存在完全有效的令牌。

相关问题