【问题标题】:Either scp or roles claim need to be present in the token using when application permissions to read sharepoint sites当应用程序权限读取共享点站点时,令牌中需要存在 scp 或角色声明
【发布时间】:2019-09-26 00:26:28
【问题描述】:

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

我想连接到不同的租户并阅读 SharePoint 网站。以下是我已请求并收到管理员同意的权限:

目前,我已经设置了 App Secret,但我确实计划稍后迁移到证书。

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

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 

我做错了什么?

【问题讨论】:

    标签: microsoft-graph-api sharepoint-online


    【解决方案1】:

    首先要了解的是,您不能同时获得应用程序和委托权限,这是一个非此即彼的情况。您收到的类型完全取决于您用于请求令牌的 OAuth 授权:

    • 授权代码和隐式返回具有scp 属性的委托令牌
    • 客户端凭据返回具有roles 属性的应用程序令牌

    第二件事是您请求了两个不同 API 的范围。根据您的选择,您将无法通过 Microsoft Graph 访问 SharePoint,因为您只请求访问旧版 SharePoint API。更重要的是,您只为 Graph 请求了 Delegated User.Read 范围,因此当您使用客户端凭据获取令牌时,该令牌将没有任何权限。

    为了获得用于读取 SharePoint 网站的应用程序令牌,您需要选择 Sites.Read.All Microsoft Graph Application permission

    【讨论】:

    • 谢谢马克!当您创建一个我认为需要的新应用程序时添加了委派权限,因此我没有删除它。删除该委派权限并添加 User.Read.All 应用程序权限并授予管理员同意已解决此问题。
    • 嗨,Marc,您提到“您将无法通过 Microsoft Graph 访问 SharePoint,因为您只请求访问旧版 SharePoint API”。我在请求 API 权限下看到了 SharePoint 的一个选项。那么我选择了正确的选项吗?
    • 您需要“Microsoft Graph”下的Sites.Read.All 权限,而不是“SharePoint”下的Sites.Read.All
    • 谢谢马克!那成功了。在“Microsoft Graph”下设置 Sites.Read.All 允许您搜索站点并枚举站点下的子站点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    相关资源
    最近更新 更多