我尝试使用NodeJ访问Azure AD的一些细节。我可以获得访问令牌,但是每当我尝试使用Graph API调用任何内容时(在这种情况下只是所有组的列表),它表示我有"没有足够的权限来完成操作。 #34;
我已经进入AD中的应用程序并添加了所有权限(只是为了确保)而且我仍然收到此错误 - 我错过了什么吗?这是我的代码:
var msRestAzure = require('ms-rest-azure');
var graphRbacManagementClient = require('azure-graph');
var tenantId='';
// Enter your tenant ID here which can be found from your Azure AD URL
// Eg. https://manage.windowsazure.com/example.com#Workspaces/ActiveDirectoryExtension/Directory/<TenantId>/users
var clientId = ''
var clientSecret = ''
console.log('Starting');
msRestAzure.loginWithServicePrincipalSecret(clientId, clientSecret, tenantId, { tokenAudience: 'graph' }, function (err, credentials, subscriptions) {
if(err){
console.log('Could not get token', err)
}
console.log('Logged In');
var client = new graphRbacManagementClient(credentials, tenantId);
console.log("Client created");
client.groups.list({}, function(err, result){
if(err){
console.log('Could not list groups', err)
}
})
});
返回的错误是:
{
"statusCode": 403,
"request": {
"rawResponse": false,
"queryString": {
},
"method": "GET",
"headers": {
"x-ms-client-request-id": "2b0e7464-bf4f-41d3-8440-38797bf0d72b",
"accept-language": "en-US",
"Content-Type": "application/json; charset=utf-8"
},
"url": "https://graph.windows.net/5a677fc4-23da-4e7a-a0fa-75f2c53e9c90/groups?api-version=1.6",
"body": null
},
"response": {
"body": "{\"odata.error\":{\"code\":\"Authorization_RequestDenied\",\"message\":{\"lang\":\"en\",\"value\":\"Insufficient privileges to complete the operation.\"}}}",
"headers": {
"cache-control": "no-cache",
"pragma": "no-cache",
"content-type": "application/json;odata=minimalmetadata;streaming=true;charset=utf-8",
"expires": "-1",
"server": "Microsoft-IIS/8.5",
"ocp-aad-diagnostics-server-name": "F3xU7bkLCvTOf62bCyNdsiLFnuyfFODP68vB9RmoAS0=",
"request-id": "f8404560-e300-4cd1-8a4b-a6487b06f7a2",
"client-request-id": "97cd97fa-448f-44bb-87dc-7d48505e80db",
"x-ms-dirapi-data-contract-version": "1.6",
"ocp-aad-session-key": "REMOVED",
"x-content-type-options": "nosniff",
"dataserviceversion": "3.0;",
"strict-transport-security": "max-age=31536000; includeSubDomains",
"access-control-allow-origin": "*",
"x-aspnet-version": "4.0.30319",
"x-powered-by": "ASP.NET, ASP.NET",
"duration": "1097838",
"date": "Wed, 05 Oct 2016 14:10:41 GMT",
"connection": "close",
"content-length": "139"
},
"statusCode": 403
},
"body": {
"code": "Authorization_RequestDenied",
"message": "Insufficient privileges to complete the operation."
}
}
为了进行测试,我已将图形和azure AD的所有权限添加到此客户端:
答案 0 :(得分:3)
仅仅因为您在Azure门户中选择了权限并不意味着您的应用已被授予他们。我建议使用像calebb.net这样的JWT解码器解码你发送给AAD Graph的令牌。令牌的scp
或roles
声明应包含必要的权限,在本例中为Groups.Read.All
。
如果令牌遗失Groups.Read.All
,您需要让租户管理员使用here所述的prompt=admin_consent
参数“同意”该应用。这将为您的应用程序授予您所请求的权限。
如果令牌包含Groups.Read.All
权限,您应该告诉我们,因为这将是图谱API中的错误。
答案 1 :(得分:0)
为了能够调用特定的REST API,我们需要确保有足够的权限。群组REST要求登录的用户有权使用。
有两种范围,仅限app或委派。仅限应用程序的作用域(也称为应用程序角色)为应用程序授予作用域提供的全部权限。仅限应用程序的作用域通常由作为服务运行的应用程序使用,而不存在已登录的用户。
委派的权限范围适用于代表用户执行的应用。这些范围委派登录用户的权限,允许应用程序充当用户。 授予应用程序的实际权限将是范围授予的权限与登录用户拥有的权限的最小权限组合(交集)。例如,如果权限范围授予委派权限以写入所有目录对象,但登录用户仅具有更新其自己的用户配置文件的权限,则该应用程序将只能编写已登录用户的配置文件但没有其他对象。
此规范是关于Microsoft Graph的文档,但它也应该适用于其他Microsoft服务。