Las solicitudes a MS Graph API me dan "Solicitud de autorización denegada: privilegios insuficientes para completar la operación"

Tengo una pregunta sobre el mensaje "Solicitud de autorización denegada: privilegios insuficientes para completar la operación" que sigo recibiendo de mis solicitudes a la API de Windows Graph.

Específicamente, estoy trabajando en la nube de 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 aparecer el controlador de inicio de sesión web, inicio sesión con mi un / pw, y luego me permite acceder a los datos de mi Easy Table ... etc.

Ahora, quiero invocar una API fácil que he creado en Azure llamadagetUserData. 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 la identificación del objeto de usuario del objeto de solicitud:

req.azureMobile.user.getIdentity().then((data) => {
   //get user object ID
}

2º, haga una solicitud parahttps://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
}

Me devuelven muchos datos, incluido el token de acceso.

Tercero, haga una solicitud parahttps://graph.windows.net/y proporcione esto, 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 puedaDatos del 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. Obtuve correctamente 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 de esta manera:

Sigo recibiendo el mensaje "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 verifiqué todos mis permisos AAD y Graph.

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 aprecio el tiempo de todos.

Respuestas a la pregunta(1)

Su respuesta a la pregunta