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

如何获取SharePoint OAuth 2.0访问/刷新令牌并解决401授权错误

解决SharePoint API OAuth 2.0 401错误及正确令牌流程

错误根源拆解

1. SharePoint应用(ACS端点)的「Token type is not allowed」

你用的https://accounts.accesscontrol.windows.net/tenant-id/tokens/oauth/2是旧版SharePoint Add-in模型的ACS令牌端点,生成的令牌仅适用于SP Add-in的旧API,无法调用现代SharePoint REST API——后者只接受Azure AD颁发的令牌。

2. Azure AD应用的「AudienceUriValidationFailedException」

这个错误的核心是令牌受众(aud字段)不匹配:

  • 你请求令牌时的scope指向了非SharePoint的资源(比如Graph API),导致令牌的aud不是SharePoint站点的URL
  • 正确的受众必须是你的SharePoint站点根地址(如https://contoso.sharepoint.com)或admin站点(https://contoso-admin.sharepoint.com)

正确的Access/Refresh Token生成流程(Azure AD授权码流)

前置配置

在Azure AD完成应用注册:

  • 开启「授权码流」(应用→认证→高级设置→授权码流)
  • 配置重定向URI(桌面应用用http://localhost,Web应用填你的回调地址)
  • 授予SharePoint委派权限(如Sites.Read.All、Sites.FullControl.All),租户级权限需完成管理员同意

步骤1:获取授权码

构造并跳转至授权URL(替换占位符):

https://login.microsoftonline.com/tenant-id/oauth2/v2.0/authorize?
client_id=你的应用ID
&response_type=code
&redirect_uri=你的重定向URI
&response_mode=query
&scope=https://contoso.sharepoint.com/Sites.Read.All offline_access
&state=随机字符串(用于防CSRF)
  • 必须包含offline_access才能拿到refresh token
  • scope中的站点URL要和你后续调用的SP站点完全一致

步骤2:交换授权码拿令牌

向Azure AD令牌端点发送POST请求:

POST https://login.microsoftonline.com/tenant-id/oauth2/v2.0/token
Content-Type: application/x-www-form-urlencoded

client_id=你的应用ID
&client_secret=你的应用密钥(Web应用必填,桌面应用可省略)
&code=步骤1拿到的授权码
&redirect_uri=你的重定向URI
&grant_type=authorization_code

响应里会返回:

  • access_token:用于调用SP API的有效令牌
  • refresh_token:过期后刷新令牌用
  • expires_in:令牌有效期(默认3600秒)

步骤3:用Refresh Token刷新令牌

当access token过期时,发送以下请求:

POST https://login.microsoftonline.com/tenant-id/oauth2/v2.0/token
Content-Type: application/x-www-form-urlencoded

client_id=你的应用ID
&client_secret=你的应用密钥
&refresh_token=之前获取的refresh token
&grant_type=refresh_token
&scope=https://contoso.sharepoint.com/Sites.Read.All offline_access

调用SharePoint API的正确姿势

核心要求

将access token放在Authorization请求头,格式为:

Authorization: Bearer {你的access token}

示例请求(获取站点列表)

GET https://contoso.sharepoint.com/_api/web/lists
Accept: application/json;odata=nometadata
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6...

关键注意事项

  • 令牌的aud必须和API请求的站点URL完全匹配,否则会再次触发受众验证错误
  • 不要混用Graph API令牌和SharePoint API令牌,两者受众不同
  • 如果是应用级权限(无需用户交互),使用客户端凭证流(grant_type=client_credentials),scope填https://contoso.sharepoint.com/.default

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 03:50:29