我使用的是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帐户。我可以使用访问令牌访问他的日历,但该令牌已过期。
我如何在一段时间后刷新令牌?
1条答案
按热度按时间rt4zxlrg1#
这就是从msal-node库中获取刷新令牌的方法吗?
我不确定这是否可行。看起来是可行的,但一旦你有了令牌,你仍然需要处理实际的刷新过程。你可以使用ConfidentialClientApplication对象的
.acquireTokenByRefreshToken()
方法,这里有文档,但根据文档,这不是Microsoft打算使用这个库的方式,如果你依赖这种不受支持的工作流,如果Microsoft更改任何内容,您的代码很容易意外中断。我如何在一段时间后刷新令牌?
在msal-node中,开发人员不打算自己做这件事。有关讨论,请参阅this github issue。库缓存它接收的令牌,您打算像这样使用它们:
在这个例子中(这是刚刚从this非常翔实的链接复制)
cca
是你的ouathClient
变量的等价物。默认情况下,令牌缓存只在内存中进行。
不幸的是,这不适合生产应用程序,因为内存缓存只会在MSAL示例的生命周期内持久化令牌数据,这意味着如果进程重新启动,您将丢失令牌。如果您的服务器作为多个进程运行,它们必须共享内存。
缓存是在创建PublicClientApplication或ConfidentialClientApplication对象时配置的。
cache
是Configuration对象的一个可选属性,客户端构造函数在其中接受。我从上面的示例代码中提取的The page详细讨论了如何实现与msal-node库的协议匹配的缓存解决方案。有一个official extension库(github repo有更好的文档),它有一个该高速缓存持久化到磁盘的解决方案,但它的预期用途是PublicClientApplications。
对于在服务器上运行的ConfidentialClientApplication示例,最好的解决方案是实现一个L1/L2缓存,其中L2是一个分布式存储,如Redis(源代码)。对于稍微简单的东西(内存中只有当前服务的用户的令牌),您可以转到msal-node-samples并查看ExpressTestApp示例,它使用Redis实现持久缓存。