如何获取SharePoint 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
相关产品推荐
相关产品推荐

