这是如何获得一个刷新令牌使用msal-node库?

ep6jt1vc  于 2023-03-22  发布在  Node.js
关注(0)|答案(1)|浏览(124)

我使用的是msal nodejs库。

const ouathClient = new msal.ConfidentialClientApplication(msalConfig);

const tokenRequest = {
   code: request.query.code,
   scopes: process.env.OUTLOOK_OAUTH_SCOPES.split(','),
   redirectUri: process.env.DOMAIN_NAME + "/outlook/oauth/redirect",
   accessType: "offline"
};

const response = await ouathClient.acquireTokenByCode(tokenRequest);

const accessToken = response.accessToken;
const refreshToken = () => {
const tokenCache = ouathClient.getTokenCache().serialize();
const refreshTokenObject = (JSON.parse(tokenCache)).RefreshToken
const refreshToken = refreshTokenObject[Object.keys(refreshTokenObject)[0]].secret;
                return refreshToken;
            }
const tokens = {
   accessToken,
   refreshToken: refreshToken()
}

这是如何从msal-node库中获取刷新令牌吗?我创建了一个连接医生和患者的应用程序。我希望患者能够在医生的outlook日历上预订时间。我需要访问医生的outlook帐户。我可以使用访问令牌访问他的日历,但该令牌已过期。
我如何在一段时间后刷新令牌?

rt4zxlrg

rt4zxlrg1#

这就是从msal-node库中获取刷新令牌的方法吗?
我不确定这是否可行。看起来是可行的,但一旦你有了令牌,你仍然需要处理实际的刷新过程。你可以使用ConfidentialClientApplication对象的.acquireTokenByRefreshToken()方法,这里有文档,但根据文档,这不是Microsoft打算使用这个库的方式,如果你依赖这种不受支持的工作流,如果Microsoft更改任何内容,您的代码很容易意外中断。
我如何在一段时间后刷新令牌?
在msal-node中,开发人员不打算自己做这件事。有关讨论,请参阅this github issue。库缓存它接收的令牌,您打算像这样使用它们:

const someUserHomeAccountId = "Enter_User_Home_Account_Id";

const msalTokenCache = cca.getTokenCache();
const account = await msalTokenCache.getAccountByHomeId(someUserHomeAccountId);

const silentTokenRequest = {
    account: account,
    scopes: ["user.read"],
};

cca.acquireTokenSilent(silentTokenRequest).then((response) => {
    // do something with response
}).catch((error) => {
    // catch and handle errors
});

在这个例子中(这是刚刚从this非常翔实的链接复制)cca是你的ouathClient变量的等价物。
默认情况下,令牌缓存只在内存中进行。
不幸的是,这不适合生产应用程序,因为内存缓存只会在MSAL示例的生命周期内持久化令牌数据,这意味着如果进程重新启动,您将丢失令牌。如果您的服务器作为多个进程运行,它们必须共享内存。
缓存是在创建PublicClientApplication或ConfidentialClientApplication对象时配置的。cacheConfiguration对象的一个可选属性,客户端构造函数在其中接受。我从上面的示例代码中提取的The page详细讨论了如何实现与msal-node库的协议匹配的缓存解决方案。
有一个official extension库(github repo有更好的文档),它有一个该高速缓存持久化到磁盘的解决方案,但它的预期用途是PublicClientApplications。
对于在服务器上运行的ConfidentialClientApplication示例,最好的解决方案是实现一个L1/L2缓存,其中L2是一个分布式存储,如Redis(源代码)。对于稍微简单的东西(内存中只有当前服务的用户的令牌),您可以转到msal-node-samples并查看ExpressTestApp示例,它使用Redis实现持久缓存。

相关问题