Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Azure AD注册的应用程序查询Sharepoint REST api(而不是图形api)?_Azure_Sharepoint_Oauth 2.0 - Fatal编程技术网

如何使用Azure AD注册的应用程序查询Sharepoint REST api(而不是图形api)?

如何使用Azure AD注册的应用程序查询Sharepoint REST api(而不是图形api)?,azure,sharepoint,oauth-2.0,Azure,Sharepoint,Oauth 2.0,我在Azure AD中注册了一个web应用程序,并让它与Graph API一起工作。但我希望能够改为查询Sharepoint REST API 我已将sharepoint委派权限范围“AllSites.Read”添加到我的应用程序中(除了我以前使用的Graph API范围之外),并在从用户处获取oauth令牌时请求此范围(除了其他delagated msgraph范围之外)。我使用https://login.microsoftonline.com/common/oauth2/v2.0用于授权/令

我在Azure AD中注册了一个web应用程序,并让它与Graph API一起工作。但我希望能够改为查询Sharepoint REST API

我已将sharepoint委派权限范围“AllSites.Read”添加到我的应用程序中(除了我以前使用的Graph API范围之外),并在从用户处获取oauth令牌时请求此范围(除了其他delagated msgraph范围之外)。我使用
https://login.microsoftonline.com/common/oauth2/v2.0
用于授权/令牌调用,但我无法成功查询:

我的查询看起来像
client.get(f“https://{tenant}.sharepoint.com/_api/web/list”)
其中
tenant
是我正在使用的令牌的特定用户的租户

我得到的错误看起来像
{'error\u description':'Invalid issuer or signature'.}
with
reason=“令牌包含无效签名。”;响应标题中的category=“invalid_client”

我可以查询Graph api,但也希望能够查询Sharepoint REST api,因为Graph api不足以满足我的实际使用情况,即获取Sharepoint组(当我请求组时,Graph api不提供Sharepoint组,仅提供Office 365和Azure AD组)

更新: 我在应用程序上设置的权限:

我还没有在公开API中添加任何作用域,我不知道是否需要添加。我不需要这个部分就可以让它与Graph API一起工作

最后,我要提到的是,在Postman中,使用OAuth 2.0完全以此作为请求的受控环境:

  • 验证URL:
  • 访问令牌URL:
  • 客户识别码
  • 客户机密
  • 范围:所有站点
我成功地获得了一个包含所有角色的令牌,尽管它仍然不允许我访问
https://.sharepoint.com/_api/web/lists
。我得到以下错误:

    "error": {
        "code": "-2147024891, System.UnauthorizedAccessException",
        "message": {
            "lang": "en-US",
            "value": "Access denied. You do not have permission to perform this action or access this resource."
        }
    }
}

不可否认,这可能是我之前遇到的无效客户端错误的一个进步,但仍然非常棘手。

您可以尝试在PostMan中获取Access令牌以进行测试

Callback URL:        https://www.getpostman.com/oauth2/callback
Auth URL :           https://login.microsoftonline.com/common/oauth2/authorize?resource=https://<tenant_name>.sharepoint.com  
Access Token URL :   https://login.microsoftonline.com/common/oauth2/token  
Client ID :          <Application_ID>  
Client Secret :      <KEY>  
Grant Type :         Authorization Code 
回调URL:https://www.getpostman.com/oauth2/callback
验证URL:https://login.microsoftonline.com/common/oauth2/authorize?resource=https://.sharepoint.com  
访问令牌URL:https://login.microsoftonline.com/common/oauth2/token  
客户端ID:

参考:


我在《邮递员》中做到了这一点:

  • OAuth2.0
  • 授权类型:授权代码
  • 验证URL:
  • 访问令牌URL:
  • 客户端ID:
  • 客户机密:
  • 范围:https://.sharepoint.com/AllSites.FullControl
我获取的令牌具有我在应用程序上设置的所有权限,包括Graph API权限和我在auth请求的Scope参数中未请求的Sharepoint作用域:

“scp”:“AllSites.FullControl AllSites.Read Directory.Read.All Files.Read.All Group.Read.All MyFiles.Read Sites.Read.All Sites.Search.All User.Read User.Read.All”,
这有点令人惊讶


一个关键点是在范围中设置租户url,以便令牌中的
aud
参数返回给正确的租户。它在为与图形权限(
00000003-0000-0000-c000-000000000000)关联的
resourceAppId
而不是Sharepoint权限配置之前返回。这样,
aud
设置为
https://.sharepoint.com
并且我能够访问
https://.sharepoint.com/_api/web/lists

这似乎是令牌中的一个错误,您可以使用它来解析访问令牌并提供屏幕截图吗?@CarlZhao可能是您感兴趣的某个特定部分?“aud”是guid
00000003-0000-0000-c000-000000000000
,除非我将租户url前缀设置为每个作用域,否则它就是租户的url。否则,还有一个用户电子邮件的
upn
,作用域如下`AllSites.Read Directory.Read.All email Files.Read.All Group.Read.All openid profile Sites.Read.All,因此它缺少我在api上设置的所有sharepoint作用域,除了我在auth请求中明确要求的作用域之外。我将使用我在应用程序注册中设置的API权限更新问题。@CarlZhao在Postman(一个孤立的环境)中尝试使用此功能后,我已使用路障更新了问题。如果您有任何建议,请告诉我当请求令牌时,我收到一个错误
AADSTS901002:不支持'resource'请求参数。
事实上,我在参考文章中链接的文档中没有看到它,其中说明请求访问令牌时,
,身份验证URL必须具有资源参数而不是范围参数
。它对你有用吗?顺便说一句,我在Azure广告中添加了Sharepoint范围。我是否还需要在Azure AD中应用程序注册的“公开API”部分下添加作用域?链接资源在底部表示,对于OAuth v2.0.Great的作者,它不起作用。如果有效的话,你可以接受你自己的回答。