我有一个 bash 脚本,它使用 curl 和 Microsoft Graph API 来获取我想要的内容。但我无法使用 MS Java Graph Api SDK 将此脚本转换为 Kotlin 代码。
工作脚本是:
export CLIENT_ID='XXX'
export CLIENT_SECRET='XXX'
export TENANT_ID='XXX'
exoprt SCOPE='api://ourApp/2023/CustomScope'
export TOKEN=`curl \
-d grant_type=client_credentials \
-d client_id=$CLIENT_ID \
-d client_secret=$CLIENT_SECRET \
-d scope=$SCOPE \
-d resource=https://graph.microsoft.com \
https://login.microsoftonline.com/$TENANT_ID/oauth2/token \
| jq -j .access_token`
curl -X GET \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
https://graph.microsoft.com/v1.0/servicePrincipals/XXX/appRoleAssignedTo \
| jq .
我获得了应用程序的角色分配列表。(具有正确权限的 API 在该范围内公开)
现在我正尝试使用文档在 Kotlin 中重新创建它:https://learn.microsoft.com/en-us/graph/sdks/choose-authentication-providers ?tabs=csharp#client-credentials-provider
val clientSecretCredential = ClientSecretCredentialBuilder()
.clientId(appId)
.clientSecret(secret)
.tenantId(tenantId)
.build()
client = GraphServiceClient(
clientSecretCredential,
"api://ourApp/2023/CustomScope"
)
val result = client.servicePrincipals().byServicePrincipalId(appObjectId).get().appRoleAssignedTo
如果我使用此客户端发出请求,我会收到错误
com.microsoft.aad.msal4j.MsalServiceException: AADSTS1002012: The provided value for scope api://drupalwiki/2023/SyncEverything openid profile offline_access is not valid. Client credential flows must have a scope value with /.default suffixed to the resource identifier (application ID URI)
如果我使用“https://graph.microsoft.com/.default”作为范围,我只会得到一个空列表。我最终也无法将我们的范围重命名为例如“api://ourApp/2023/.default”,因为 Azure UI 说这个名称无效。除此之外,由于 bash 脚本有效,我只想以相同的方式初始化客户端,这可能吗?
非常感谢!