如何使用Azure AD注册的应用程序查询Sharepoint REST api(而不是图形api)?
我在Azure AD中注册了一个web应用程序,并让它与Graph API一起工作。但我希望能够改为查询Sharepoint REST API 我已将sharepoint委派权限范围“AllSites.Read”添加到我的应用程序中(除了我以前使用的Graph API范围之外),并在从用户处获取oauth令牌时请求此范围(除了其他delagated msgraph范围之外)。我使用如何使用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用于授权/令
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'.}
withreason=“令牌包含无效签名。”;响应标题中的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”是guid00000003-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的作者,它不起作用。如果有效的话,你可以接受你自己的回答。