Os pedidos para a API do MS Graph me dão "Solicitação de autorização negada - privilégios insuficientes para concluir a operação"

Tenho uma pergunta sobre a mensagem "Solicitação de autorização negada - privilégios insuficientes para concluir a operação" que continuo recebendo de minhas solicitações à API do Windows Graph.

Especificamente, estou trabalhando na nuvem do Azure. Eu tenho um aplicativo móvel iOS que chama uma API. Ativei "Autenticação para o Active Directory" no meu Portal.

Em seguida, no lado do cliente (iOS):

[self.todoService.client loginWithProvider:@"windowsazureactivedirectory"
                                controller:self
                                  animated:YES
                                completion:^(MSUser *user, NSError *error) {

                                    if(!error && user) {
                                        [self refresh];

                                    } 
                                }]; //loginWithProvider

Então, retorna um objeto MSUser válido. Vejo o controlador de login na Web aparecer, faço login com meu un / pw e, em seguida, ele me permite acessar os dados da minha tabela fácil ... etc.

Agora, quero chamar uma API Fácil que eu criei no Azure chamadagetUserData. Portanto, basta inserir o 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

Está tudo bem como a API é chamada e posso ver os dados da resposta.

No lado do servidor (Node JS), eu basicamente faço 3 coisas:

O primeiro é obter o ID do objeto de usuário do objeto de solicitação:

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

Segundo, faça uma solicitação parahttps://login.windows.net para obter um token de acesso com um nome de usuário / senha.

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
}

Recebo um monte de dados de volta, incluindo o token de acesso.

3º, faça um pedido parahttps://graph.windows.net/e forneça isso, token de acesso junto com meu ID de objeto de usuário:

var options = {
    url: "https://graph.windows.net/" + tenant_domain + "/users/" + objectId + "?api-version=1.0",
    method: 'GET',
    headers: {
        "Authorization": "Bearer " + access_token
    }
};

Isto é para que eu possaDados do usuário. Agora, em uma Assinatura de teste separada, configurei todas as permissões básicas de leitura para o AAD e o Graph no meu gerenciamento do AAD. Consigo recuperar os dados completos do usuário da seguinte maneira:

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
}

No entanto, em outra assinatura, executei exatamente as mesmas etapas. Mesmo indo até a verificação de todas as permissões da seguinte forma:

Continuo recebendo a mensagem "Solicitação de autorização negada, privilégios insuficientes". O erro é nulo, então eu sei que tudo o resto passou corretamente.

Não consigo descobrir o porquê, porque tudo é processado e verifiquei todas as minhas permissões de AAD e Graph.

resultado do log:

-----corpo------

'{"odata.error": {"code": "Authorization_RequestDenied", "message": {"lang": "en", "value": "Privilégios insuficientes para concluir a operação."}}}'

Obrigado por qualquer ajuda e aprecio o tempo de todos

questionAnswers(1)

yourAnswerToTheQuestion