如何使用 v1 Azure AD 应用程序和客户端凭据访问 Sharepoint Online API
How to Access Sharepoint Online API with v1 Azure AD Application and Client Credentials
我无法使用 Postman 对 Sharepoint Online 进行 API 调用。我已经成功地 API 调用了图形 API,所以我很熟悉我认为这应该如何工作。
我已按照以下说明进行设置:
- 用于创建证书和注册 v1 Azure 应用程序:
https://docs.microsoft.com/en-us/sharepoint/dev/solution-guidance/security-apponly-azuread
- 使用客户端凭据流程:https://docs.microsoft.com/en-us/azure/active-directory/develop/v1-oauth2-client-creds-grant-flow
- 用于创建客户端断言:https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-certificate-credentials
第一篇文章说它不接受使用客户端密钥生成的访问令牌,但我已经用密钥和证书生成了令牌,但没有发现任何区别。
调用任何内容时,例如:
https://<tenant>.sharepoint.com/_api/web
我收到错误:
{"error_description":"Exception of type 'Microsoft.IdentityModel.Tokens.AudienceUriValidationFailedException' was thrown."}
这是我使用 v1 /token 端点生成的访问令牌示例:
{
"aud": "https://microsoft.sharepoint-df.com/",
"iss": "https://sts.windows.net/462c0b***********c3708/",
"iat": 1569243291,
"nbf": 1569243291,
"exp": 1569247191,
"aio": "42FgYDiXt***********==",
"app_displayname": "T***********n",
"appid": "00c***********2b",
"appidacr": "2",
"idp": "https://sts.windows.net/46***********708/",
"oid": "2f8a5***********684",
"roles": [
"User.ReadWrite.All",
"TermStore.Read.All",
"Sites.FullControl.All"
],
"sid": "5ab8d57***********0bc",
"sub": "2f8a5***********684",
"tid": "462c0***********708",
"uti": "aHt8d***********9AA",
"ver": "1.0"
}
如您在第一篇文章中所见,使用客户端密码生成的访问令牌不受 SharePoint 的仅应用程序令牌身份验证支持。
如果你解码access token,你会发现对于"appidacr",如果使用了client ID和client secret,则值为“1”。如果使用客户端证书进行身份验证,则值为“2”。查看详细信息 here。
客户端证书比客户端密码更安全。提供双重验证和保护。
您可以参考此 3rd-party article 使用证书获取 Azure AD 应用专用访问令牌,并使用此访问令牌访问您的 SharePoint 资源。
当然,您在评论中提到的文章也很有帮助。它使用ACS完成认证。
错误消息似乎暗示我在 /token 端点调用中的资源参数设置不正确。我相信这在 Microsoft 文档中被省略了,因为文档是如此划分。 V1 应用调用 SharePoint Online 的正确令牌端点调用如下所示:
网络服务
POST https://login.microsoftonline.com/<TARGET-TENANT-ID OR NAME>/oauth2/token
参数
client_id= <Application ID from Azure Portal>
grant_type=client_credentials
resource= https://<TARGET-TENANT-NAME>.sharepoint.com
client_assertion_type= urn:ietf:params:oauth:client-assertion-type:jwt-bearer
client_assertion= <See Link Above to create assertion>
上面的链接省略了如何计算证书 JWT 的 x5t 值。你可以使用这个:
echo $(openssl x509 -in certificate.pem -fingerprint -noout) | sed 's/SHA1 Fingerprint=//g' | sed 's/://g' | xxd -r -ps | base64
我从这里得到的:How to obtain value of "x5t" using Certificate credentials for application authentication
如果您尝试使用客户端密码而不是客户端断言,您将获得一个令牌,但 SharePoint Online REST API 将 return:
Unsupported app only token.
我无法使用 Postman 对 Sharepoint Online 进行 API 调用。我已经成功地 API 调用了图形 API,所以我很熟悉我认为这应该如何工作。
我已按照以下说明进行设置:
- 用于创建证书和注册 v1 Azure 应用程序: https://docs.microsoft.com/en-us/sharepoint/dev/solution-guidance/security-apponly-azuread
- 使用客户端凭据流程:https://docs.microsoft.com/en-us/azure/active-directory/develop/v1-oauth2-client-creds-grant-flow
- 用于创建客户端断言:https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-certificate-credentials
第一篇文章说它不接受使用客户端密钥生成的访问令牌,但我已经用密钥和证书生成了令牌,但没有发现任何区别。
调用任何内容时,例如:
https://<tenant>.sharepoint.com/_api/web
我收到错误:
{"error_description":"Exception of type 'Microsoft.IdentityModel.Tokens.AudienceUriValidationFailedException' was thrown."}
这是我使用 v1 /token 端点生成的访问令牌示例:
{
"aud": "https://microsoft.sharepoint-df.com/",
"iss": "https://sts.windows.net/462c0b***********c3708/",
"iat": 1569243291,
"nbf": 1569243291,
"exp": 1569247191,
"aio": "42FgYDiXt***********==",
"app_displayname": "T***********n",
"appid": "00c***********2b",
"appidacr": "2",
"idp": "https://sts.windows.net/46***********708/",
"oid": "2f8a5***********684",
"roles": [
"User.ReadWrite.All",
"TermStore.Read.All",
"Sites.FullControl.All"
],
"sid": "5ab8d57***********0bc",
"sub": "2f8a5***********684",
"tid": "462c0***********708",
"uti": "aHt8d***********9AA",
"ver": "1.0"
}
如您在第一篇文章中所见,使用客户端密码生成的访问令牌不受 SharePoint 的仅应用程序令牌身份验证支持。
如果你解码access token,你会发现对于"appidacr",如果使用了client ID和client secret,则值为“1”。如果使用客户端证书进行身份验证,则值为“2”。查看详细信息 here。
客户端证书比客户端密码更安全。提供双重验证和保护。
您可以参考此 3rd-party article 使用证书获取 Azure AD 应用专用访问令牌,并使用此访问令牌访问您的 SharePoint 资源。
当然,您在评论中提到的文章也很有帮助。它使用ACS完成认证。
错误消息似乎暗示我在 /token 端点调用中的资源参数设置不正确。我相信这在 Microsoft 文档中被省略了,因为文档是如此划分。 V1 应用调用 SharePoint Online 的正确令牌端点调用如下所示:
网络服务
POST https://login.microsoftonline.com/<TARGET-TENANT-ID OR NAME>/oauth2/token
参数
client_id= <Application ID from Azure Portal>
grant_type=client_credentials
resource= https://<TARGET-TENANT-NAME>.sharepoint.com
client_assertion_type= urn:ietf:params:oauth:client-assertion-type:jwt-bearer
client_assertion= <See Link Above to create assertion>
上面的链接省略了如何计算证书 JWT 的 x5t 值。你可以使用这个:
echo $(openssl x509 -in certificate.pem -fingerprint -noout) | sed 's/SHA1 Fingerprint=//g' | sed 's/://g' | xxd -r -ps | base64
我从这里得到的:How to obtain value of "x5t" using Certificate credentials for application authentication
如果您尝试使用客户端密码而不是客户端断言,您将获得一个令牌,但 SharePoint Online REST API 将 return:
Unsupported app only token.