NodeJS microsoft-graph-client获取电子邮件

gpfsuwkq  于 11个月前  发布在  Node.js
关注(0)|答案(1)|浏览(123)

我正在尝试使用microsoft-graph-client获取电子邮件列表。我获得了refresh_token并配置了App + secret。我的应用程序具有Mail.Read权限
我的代码:

const { Client } = require('@microsoft/microsoft-graph-client');
const dotenv = require('dotenv');

dotenv.config();

const clientId = process.env.OUTLOOK_CLIENT_ID;
const clientSecret = process.env.OUTLOOK_SECRET;
const tenantId = process.env.OUTLOOK_TENANT_ID;
const refreshToken = process.env.OUTLOOK_REFRESH_TOKEN;

async function getAccessToken() {
    try {
        const url = `https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token`;
        const params = new URLSearchParams();
        params.append('grant_type', 'refresh_token');
        params.append('client_id', clientId);
        params.append('client_secret', clientSecret);
        params.append('refresh_token', refreshToken);
        params.append('scope', 'https://graph.microsoft.com/.default');

        const response = await fetch(url, {
            method: 'POST',
            body: params,
        });
        // console.log(response)

        const data = await response.json();
        return data.access_token;
    } catch (error) {
        console.log(error)
    }
}

async function getNewEmails(accessToken) {
    try {
        const client = Client.init({
            authProvider: (done) => {
                done(null, accessToken);
            },
        });

        const response = await client.api("/me/messages").top(10).get()

        return response.value;
    } catch (error) {
        console.log(error)
    }
}

(async () => {
    try {
        const accessToken = await getAccessToken();
        const newEmails = await getNewEmails(accessToken);
        console.log(newEmails);
    } catch (error) {
        console.log(error)
    }
})();

字符串
我在调用“await client.API(“/me/messages”).top(10).get()”函数时得到一个错误
错误代码:

GraphError
    at new GraphError (D:\Tools\Bots\bot\node_modules\@microsoft\microsoft-graph-client\lib\src\GraphError.js:34:28)
    at Function.<anonymous> (D:\Tools\Bots\bot\node_modules\@microsoft\microsoft-graph-client\lib\src\GraphErrorHandler.js:97:30)
    at step (D:\Tools\Bots\bot\node_modules\tslib\tslib.js:193:27)
    at Object.next (D:\Tools\Bots\bot\node_modules\tslib\tslib.js:174:57)
    at D:\Tools\Bots\bot\node_modules\tslib\tslib.js:167:75
    at new Promise (<anonymous>)
    at Object.__awaiter (D:\Tools\Bots\bot\node_modules\tslib\tslib.js:163:16)
    at GraphErrorHandler.getError (D:\Tools\Bots\bot\node_modules\@microsoft\microsoft-graph-client\lib\src\GraphErrorHandler.js:87:24)
    at GraphRequest.<anonymous> (D:\Tools\Bots\bot\node_modules\@microsoft\microsoft-graph-client\lib\src\GraphRequest.js:315:84)
    at step (D:\Tools\Bots\bot\node_modules\tslib\tslib.js:193:27) {
  statusCode: 401,
  code: null,
  requestId: null,
  date: 2023-11-14T18:18:41.708Z,
  body: ReadableStream { locked: false, state: 'readable', supportsBYOB: false }
}


我从“getToken()”检查了access_token,它没有“undefined”,我得到了一切权利(我认为)。所以我的主要问题是获得电子邮件。我知道401意味着“未经授权”,但我不知道如何修复它。

0tdrvxhp

0tdrvxhp1#

如果您使用客户端凭据流,
“/我/消息”
不是有效的端点,因为服务主体没有邮箱。您需要使用要访问的用户邮箱的用户端点,例如

"/user/[email protected]/messages"

字符串
然后服务主体将模拟该用户,您可以使用策略https://learn.microsoft.com/en-us/graph/auth-limit-mailbox-access锁定您的应用可以访问的用户,如果您只需要访问邮箱的子集,这是一个好主意。

相关问题