Las solicitudes a MS Graph API me dan "Solicitud de autorización denegada: privilegios insuficientes para completar la operación"
node.js azure (1)
Puede intentar actualizar la función de la aplicación AD que utiliza a un permiso de administrador. Ejecute los siguientes comandos en PowerShell
:
Connect-MsolService
$ClientIdWebApp = ''{your_AD_application_client_id}''
$webApp = Get-MsolServicePrincipal –AppPrincipalId $ClientIdWebApp
#use Add-MsolRoleMember to add it to "Company Administrator" role).
Add-MsolRoleMember -RoleName "Company Administrator" -RoleMemberType ServicePrincipal -RoleMemberObjectId $webApp.ObjectId
Tengo una pregunta sobre el mensaje "Solicitud de autorización denegada: privilegios insuficientes para completar la operación" que sigo obteniendo de mis solicitudes a la API de Windows Graph.
Específicamente, estoy trabajando en la nube Azure. Tengo una aplicación móvil iOS que invoca una API. He activado "Autenticación para Active Directory" en mi Portal.
Luego, en el lado del cliente (iOS):
[self.todoService.client loginWithProvider:@"windowsazureactivedirectory"
controller:self
animated:YES
completion:^(MSUser *user, NSError *error) {
if(!error && user) {
[self refresh];
}
}]; //loginWithProvider
Entonces devuelve un objeto MSUser válido. Veo que aparece el controlador de inicio de sesión web, inicio sesión con mi un / pw, y luego me deja acceder a los datos de mi Easy Table ... etc.
Ahora, quiero invocar una API fácil que he creado en Azure llamada getUserData . Por lo tanto, simplemente inserto el código invokeAPI como este (iOS):
[self.todoService.client loginWithProvider:@"windowsazureactivedirectory"
controller:self
animated:YES
completion:^(MSUser *user, NSError *error) {
if(!error && user) {
//NSMutableDictionary * dict = [NSMutableDictionary dictionary];
//[dict setObject:@YES forKey:@"complete"];
NSLog(@"%s - %@", __FUNCTION__, user);
[self refresh];
[self.todoService.client invokeAPI:@"getUserData"
body:nil
HTTPMethod:@"POST"
parameters:nil
headers:nil
completion:^(id _Nullable result, NSHTTPURLResponse * _Nullable response, NSError * _Nullable error) {
NSLog(@"%s - API returned response! ", __FUNCTION__);
NSLog(@"%@", result); //TODO: user info here!! :D
}]; //invokAPI
} //if user returned from AAD login is valid
}]; //loginWithProvider
Todo está bien cuando se llama a la API y puedo ver los datos de respuesta.
En el lado del servidor (nodo JS), básicamente hago 3 cosas:
Primero es obtener el ID de objeto del usuario desde el objeto de solicitud:
req.azureMobile.user.getIdentity().then((data) => {
//get user object ID
}
Segundo, realice una solicitud a https://login.windows.net para obtener un token de acceso con un nombre de usuario / contraseña.
var options = {
url: "https://login.windows.net/" + tenant_domain + "/oauth2/token?api-version=1.0",
method: ''POST'',
form: {
grant_type: "client_credentials",
resource: "https://graph.windows.net",
client_id: clientID,
client_secret: key
}
};
req(options, function (err, resp, body) {
//get the result back
}
Obtengo una gran cantidad de datos que incluyen el token de acceso.
3.º, realice una solicitud a https://graph.windows.net/ y proporcione este token de acceso junto con mi ID de objeto de usuario:
var options = {
url: "https://graph.windows.net/" + tenant_domain + "/users/" + objectId + "?api-version=1.0",
method: ''GET'',
headers: {
"Authorization": "Bearer " + access_token
}
};
Esto es para que yo pueda datos de usuario . Ahora, en una suscripción de prueba separada, configuré todos los permisos de lectura básicos para AAD y Graph en mi administración de AAD. Logré recuperar los datos completos del usuario de la siguiente manera:
user = {
accountEnabled = 1;
assignedLicenses = (
);
assignedPlans = (
);
city = xxxxxxxxx;
country = xxxxxxxxxx;
department = Dev;
dirSyncEnabled = "<null>";
displayName = xxxxxx;
facsimileTelephoneNumber = "<null>";
givenName = hehe;
jobTitle = "iOS dev";
lastDirSyncTime = "<null>";
mail = "<null>";
mailNickname = "xxxxxxxxxx.com#EXT#";
mobile = "+xx xxx xxxx 3852";
objectId = "xxxxxxx-2c70-4aab-b261-3b2b97dc5c50";
objectType = User;
"odata.metadata" = "https://graph.windows.net/xxxxxxxxxx.onmicrosoft.com/$metadata#directoryObjects/Microsoft.WindowsAzure.ActiveDirectory.User/@Element";
"odata.type" = "Microsoft.WindowsAzure.ActiveDirectory.User";
otherMails = (
"[email protected]"
);
...etc
}
Sin embargo, en otra suscripción, hice exactamente los mismos pasos. Incluso yendo tan lejos como para verificar todos los permisos, así:
Sigo recibiendo un mensaje de "Solicitud de autorización denegada, privilegios insuficientes". El error es nulo, así que sé que todo lo demás pasó correctamente.
No puedo entender por qué porque todo se procesa y revisé todos mis permisos de AAD y Gráfico.
resultado del registro:
-----cuerpo------
''{"odata.error": {"code": "Authorization_RequestDenied", "message": {"lang": "en", "value": "Privilegios insuficientes para completar la operación".}}}''
Gracias por cualquier ayuda, y apreciamos el tiempo de todos