Node.js连接SharePoint API遇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
相关产品推荐
相关产品推荐

