MS Graph API возвращает 500 при попытке запросить группы

#sharepoint #microsoft-graph-api

#sharepoint #microsoft-graph-api

Вопрос:

Итак, я разрабатываю веб-страницу sharepoint, где мне нужно проверить, входит ли пользователь в группу AD. Теперь вот странная часть запроса MS Graph, который мне нужен для этого:

 https://graph.microsoft.com/v1.0/me/transitiveMemberOf/microsoft.graph.group?$count=true
  

И это именно тот запрос, который отправляет мой WP, но он возвращает сообщение об ошибке 500. Теперь я думал, что у меня отсутствуют разрешения, но Проводник говорит, что они мне не нужны.

Вот мой GraphService, который обрабатывает MS Graph:

 import { MSGraphClient } from '@microsoft/sp-http';
import * as MicrosoftGraph from '@microsoft/microsoft-graph-types';
import { WebPartContext } from "@microsoft/sp-webpart-base";

/**
 * The class that handles the MS Graph API calls
 */
export default class GraphService {
    /**
     * The MS Graph client with does the calls
     */
    private _client:MSGraphClient;

    /**
     * Sets the client for the Graph API, needs to be called before the class can be used
     * @param context The context of the WP
     */
    public async setClient(context:WebPartContext) {
        this._client = await context.msGraphClientFactory.getClient();
    }
    /**
     * Checks to see if a user belongs in a user group or not
     * @param groupName The group name with we want to check
     */
    public async checkCurrentUserGroup(groupName:string) {
        const rawData = await this._client.api('/me/transitiveMemberOf/microsoft.graph.group').count(true).get();
        const arr = rawData.value.filter(i => i.displayName == groupName);
        return !!arr.length;
    }


    /**
     * Returns the users from AD who have a manager and whom companyName is a specific company name
     * @param companyName The company name to whom the users need to belong to
     */
    public async getUsers(companyName:string):Promise<any[]> {
        const rawData = await this._client.api('/users').filter('accountEnabled eq true').expand('manager').select('displayName,companyName,mail,department,jobTitle').get();

        //need to do manual filtering, becuase you can't user filter on the "companyName" field and you can't search and expand at the same time without returing everything
        const filteredData = rawData.value.filter(i => i.companyName == companyName amp;amp; i.manager);

        //remaps the data to IUserModel
        const ret:any[] = filteredData.map(i => <any>{
            name: i.displayName,
            id: 0,
            email: i.mail,
            manager: i.manager.displayName,
            managerEmail: i.manager.mail,
            managerId: 0,
            hasDiscussionForm: false,
            department: i.department,
            position: i.jobTitle
        });

        return ret;
        
    } 
}
  

Тогда проблема заключается в том, что метод checkCurrentUserGroup возвращает 500.

Я дал следующие разрешения wp:

  • Group.Read.All
  • Directory.Read.All
  • Пользователь.Читать

getUsers Метод работает так, как и ожидалось.

В MS Graph Explorer запрос работает просто отлично. Чего мне не хватает?

Комментарии:

1. не могли бы вы попробовать, передав данные заголовка client.api('/users/{id}/transitiveMemberOf/microsoft.graph.group') .header('ConsistencyLevel','eventual') , сообщите нам, если это поможет

2. @SruthiJ-MSFTIdentity нет, у меня не было, и это действительно сработало, можете ли вы дать ответ, чтобы я мог принять его и, возможно, объяснение того, что произошло со мной, если его не слишком много, чтобы спросить

Ответ №1:

Согласно документу, заголовок запроса должен иметь ConsistencyLevel и конечный заголовок, и, пожалуйста, не забудьте передать заголовок запроса и, пожалуйста, обратитесь к этому документу для получения дополнительной информации

 let res = await client.api('/users/{id}/transitiveMemberOf/microsoft.graph.group')
    .header('ConsistencyLevel','eventual')
    .search('displayName:tier')
    .select('displayName,id')
    .orderby('displayName ')
    .get();