我正在开发一个项目,需要在用户的 Outlook 日历中创建事件。要求是将工作检查日期添加到相关用户的日历中。此外,用户应该能够在其日历上手动创建事件。
我所实施的:
这是代码:
路线:
router.get('/login', getAuthCodeUrl);
router.get('/callback', handleCallback);
控制器:
const { ConfidentialClientApplication } = require('@azure/msal-node');
// TEST APP
const clientId = '945bf51b-xxxx-c5a83898b4b8';
const clientSecret = '9mV8Q~xxxx.zf9GqLGt95UUJ_bGdcp';
const msalConfig = {
auth: {
clientId: clientId,
authority: `https://login.microsoftonline.com/common`,
clientSecret: clientSecret,
},
};
const redirectUri = 'http://localhost:3000/api/callback';
const scopes = [
'User.Read',
'Calendars.ReadWrite',
'offline_access',
'openid',
'profile',
];
const cca = new ConfidentialClientApplication(msalConfig);
const getAuthCodeUrl = async (req, res) => {
const authCodeUrlParameters = {
scopes,
redirectUri,
};
const authUrl = await cca.getAuthCodeUrl(authCodeUrlParameters);
console.log('authUrl: ', authUrl);
res.redirect(authUrl);
};
const handleCallback = async (req, res) => {
const tokenRequest = {
scopes,
code: req.query.code,
redirectUri,
accessType: 'offline',
};
try {
const authResult = await cca.acquireTokenByCode(tokenRequest);
const accessToken = authResult.accessToken;
const refreshToken = () => {
const tokenCache = cca.getTokenCache().serialize();
const refreshTokenObject = JSON.parse(tokenCache).RefreshToken;
const refreshToken =
refreshTokenObject[Object.keys(refreshTokenObject)[0]].secret;
return refreshToken;
};
const tokens = {
accessToken,
refreshToken: refreshToken(),
};
console.log('tokens: ', tokens);
// Handle token result, store tokens, etc.
res.send('Authentication successful. You can close this window.');
} catch (error) {
console.error('Error obtaining access token:', error);
res.status(500).send('Error obtaining access token');
}
};
这是我的问题:
try {
const authResult = await cca.acquireTokenByCode(tokenRequest);
const accessToken = authResult.accessToken;
const refreshToken = () => {
const tokenCache = cca.getTokenCache().serialize();
const refreshTokenObject = JSON.parse(tokenCache).RefreshToken;
const refreshToken =
refreshTokenObject[Object.keys(refreshTokenObject)[0]].secret;
return refreshToken;
};
cca.getTokenCache().serialize()
时,它会返回序列化令牌缓存,其中包括用户的刷新令牌。注意:访问令牌的刷新期限最长为 90 天。参考这个MsDoc
expires_in
属性。参考: