You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js连接SharePoint API遇401错误:不支持仅应用令牌

Node.js连接SharePoint时出现401 "不支持仅应用令牌"错误

问题背景

我正尝试通过Node.js应用连接SharePoint,使用基础脚本建立站点连接,操作步骤如下:

  • 创建SharePoint站点
  • 在Azure中注册应用
  • 获取Client ID和Tenant ID
  • 通过证书/机密创建密钥
  • 添加API权限:SharePoint应用权限> Sites.FullControl(或类似权限)
  • 创建config.js和app.js文件

配置与代码

config.js代码:

module.exports = {
    auth: {
        clientId: 'xxxx',
        authority: 'https://login.microsoftonline.com/xxx',
        clientSecret: 'xxx'
    },
    sharepoint: {
        siteUrl: 'https://xxx.sharepoint.com/sites/xxx',
        scopes: ['https://xxx.sharepoint.com/.default']
    }
};

app.js代码:

const msal = require('@azure/msal-node');
const axios = require('axios');
const config = require('./config');

const cca = new msal.ConfidentialClientApplication({
    auth: config.auth
});

async function getAccessToken() {
    try {
        const result = await cca.acquireTokenByClientCredential({
            scopes: config.sharepoint.scopes
        });
        return result.accessToken;
    } catch (error) {
        console.error('Error acquiring token:', error);
    }
}

async function connectToSharePoint() {
    const accessToken = await getAccessToken();
    console.log(accessToken);
    if (!accessToken) {
        console.error('Failed to acquire access token');
        return;
    }
    console.log('Access Token acquired successfully');
    const siteUrl = `${config.sharepoint.siteUrl}/_api/web`;

    console.log('Attempting to connect to:', siteUrl);

    try {
        const response = await axios.get(siteUrl, {
            headers: {
                Authorization: `Bearer ${accessToken}`,
                Accept: 'application/json;odata=verbose'
            }
        });
        console.log('Successfully connected to SharePoint!');
        console.log('Site Title:', response.data.d.Title);
    } catch (error) {
        console.error('Error connecting to SharePoint:', error.message);
        if (error.response) {
            console.error('Response status:', error.response.status);
            console.error('Response data:', JSON.stringify(error.response.data, null, 2));
        }
    }
}

connectToSharePoint();

错误现象

执行node app.js后返回:

Access Token acquired successfully
Attempting to connect to: https://xxx.sharepoint.com/sites/xxx/_api/web
Error connecting to SharePoint: Request failed with status code 401
Response status: 401
Response data: "不支持仅应用令牌。"

解决办法

这个错误是因为SharePoint Online不支持通过客户端凭据流获取的普通机密令牌调用REST API,需通过以下方式修复:

1. 切换到证书认证(推荐)

SharePoint对证书认证的应用令牌兼容性更好:

  • 在Azure AD应用注册页面,进入「证书和机密」>「证书」>「上传证书」,上传生成的PFX或CER格式证书。
  • 更新config.js,替换clientSecret为证书配置:
const fs = require('fs');

module.exports = {
    auth: {
        clientId: 'xxxx',
        authority: 'https://login.microsoftonline.com/xxx',
        clientCertificate: {
            thumbprint: '你的证书指纹',
            privateKey: fs.readFileSync('私钥文件路径', 'utf8')
        }
    },
    sharepoint: {
        siteUrl: 'https://xxx.sharepoint.com/sites/xxx',
        scopes: ['https://xxx.sharepoint.com/.default']
    }
};

2. 确认管理员已授予权限同意

在Azure AD应用的「API权限」页面,点击**「授予管理员同意」**按钮,确保应用权限已生效。

3. 调整令牌受众(备选)

若坚持使用客户端机密,需将scope改为租户级SharePoint权限,同时授予租户级应用权限:

  • 将scopes改为['https://sharepoint.com/.default']
  • 在API权限中添加租户级的Sites.FullControl.All权限,并完成管理员同意

验证修改

重新运行node app.js,配置正确的情况下会成功输出SharePoint站点标题。


内容的提问来源于stack exchange,提问作者GithyCody

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 19:37:21