当应用程序权限用于读取SharePoint站点时,令牌中必须包含SCP或角色声明。

4
我在Azure中创建了一个应用程序,并设置其使用访问令牌和ID令牌。

enter image description here

我希望能够连接到不同的租户并读取SharePoint站点。以下是我请求并已获得管理员同意的权限:

enter image description here

目前,我已经设置了一个应用程序秘钥,但是我计划以后转移到证书。

我有这段代码来获取访问令牌,我确实得到了一个访问令牌:

const params = new URLSearchParams();
params.append("grant_type", "client_credentials");
params.append("scope", "https://graph.microsoft.com/.default");
params.append("client_id", process.env.client_id);
params.append("client_secret", process.env.client_secret);

var url = `https://login.microsoftonline.com/${tenant}/oauth2/v2.0/token`;
const response = await fetch(url,
    {
        method: 'POST',
        body: params,
        headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
    }
);

然而,当我尝试读取以下根站点时
var url = "https://graph.microsoft.com/v1.0/sites?search=*";
const response = await fetch(url,
    {
        method: 'GET',
        headers: { 'Authorization': `Bearer ${access_token}` }
    }
);

我遇到了这个错误:
error: { 
    code: 'AccessDenied',
    message: 'Either scp or roles claim need to be present in the token.',
    innerError: { 
        'request-id': 'ec47913f-2624-4d1c-9b27-5baf05ccebfd',
        date: '2019-08-16T14: 15: 37'
    }
}

我在https://jwt.io/检查了令牌,确实没有rolesscp的条目。

看起来我错过了一步,但我无法确定是哪一步。

我是这样获取令牌的:

https://login.microsoftonline.com/${tenant}/oauth2/v2.0/token 

我做错了什么?
1个回答

5
首先要明白的是,无法在同一令牌中同时接收应用程序权限和委派权限,这是一个二选一的情况。您接收哪种类型完全取决于您用于请求令牌的OAuth授权方式:
- 授权代码和隐式请求具有scp属性的委派令牌 - 客户端凭据请求具有roles属性的应用程序令牌。
其次,您已经请求了两个不同API的作用域。根据您选择的内容,您将无法通过Microsoft Graph访问SharePoint,因为您只请求了对传统SharePoint API的访问权限。更重要的是,当您使用客户端凭据获取令牌时,您仅请求了Graph的委派User.Read范围,因此该令牌将没有任何权限。
为了获得用于读取SharePoint站点的应用程序令牌,您需要选择Sites.Read.All Microsoft Graph Application权限。详见:Microsoft Graph Application permission

1
谢谢Marc!当您创建新应用程序时,委派权限会被添加,我认为这是必需的,因此我没有删除它。删除该委派权限并添加User.Read.All应用程序权限并授予管理员同意已解决问题。 - iJK
嗨,马克,你提到“你没有通过Microsoft Graph访问SharePoint的权限,因为你只请求了遗留的SharePoint API”。我在请求API权限下看到了一个SharePoint选项。所以我选择了正确的选项吗? - iJK
3
你需要在“Microsoft Graph”下获取“Sites.Read.All”权限,而不是在“SharePoint”下获取“Sites.Read.All”权限。 - Marc LaFleur
1
谢谢Marc!这就解决了问题。在“Microsoft Graph”下设置Sites.Read.All允许您搜索站点并枚举站点下的子站点。 - iJK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接