Общий каталог OneDrive из аутентификации приложения - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть приложение, которое обрабатывает кучу данных и генерирует некоторые результаты.В настоящее время приложение отправляет результаты по электронной почте, но это может быть громоздким, и электронная почта может стать слишком большой, поэтому я хочу, чтобы приложение сохраняло результаты в общей папке OneDrive.Приложение работает без взаимодействия с пользователем.

Я искал несколько примеров для Microsoft.Graph SDK.Я смог пройти проверку подлинности с помощью приложения и рабочего процесса ConfidentialClient, но я не уверен, как найти / получить доступ к общему каталогу в OneDrive.В настоящее время только запрос корневого диска не возвращает никаких дочерних элементов или чего-либо полезного.Я мог получить доступ к общему диску, когда использовал API для входа в систему как мой пользователь, но для этого я использовал ссылку общего доступа.Нужно ли как-то генерировать ссылку на приложение для приложения или нет привязки к пользователю?Или есть какой-то другой способ найти общий диск?

Вот код, создающий мой GraphServiceClient:

public static GraphServiceClient GetAuthenticatedClient()
        {
            if (graphClient == null)
            {
                ConfidentialClientApp = ConfidentialClientApplicationBuilder.Create(clientId).WithTenantId(FormBrowser.MsaTenantId).WithClientSecret(FormBrowser.MsaClientSecret).Build();
                ClientCredentialProvider authProvider = new ClientCredentialProvider(ConfidentialClientApp);
                graphClient = new GraphServiceClient(authProvider);
            }
            return graphClient;
        }

Затем я попробовал некоторые из этих различных вызовов, просто чтобы убедиться, что этоправильная аутентификация:

   //var shares = await this.graphClient.Shares[encodedUrl].Root.Request().Expand(expandValue).GetAsync();
                    //ProcessFolder(shares);
                    var drive = graphClient.Drive.Request().GetAsync();
                    ProcessFolder(await this.graphClient.Drive.Root.Request().Expand(expandValue).GetAsync());

Вот пример ответа JSON от запроса Drive.Root:

{
    "createdDateTime": "2013-11-07T19:59:00+00:00",
    "lastModifiedDateTime": "2019-09-15T02:12:23+00:00",
    "name": "root",
    "webUrl": "https://<company>.sharepoint.com/Documents",
    "fileSystemInfo": {
        "createdDateTime": "2013-11-07T19:59:00+00:00",
        "lastModifiedDateTime": "2019-09-15T02:12:23+00:00"
    },
    "folder": {
        "childCount": 0
    },
    "parentReference": {
        "driveId": "<stuff>",
        "driveType": "documentLibrary"
    },
    "root": {

    },
    "size": 0,
    "children": [

    ],
    "thumbnails": [

    ],
    "id": "<stuff>",
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#drive/root(thumbnails(),children(thumbnails()))/$entity",
    "children@odata.context": "https://graph.microsoft.com/v1.0/$metadata#drive/root/children(thumbnails())",
    "thumbnails@odata.context": "https://graph.microsoft.com/v1.0/$metadata#drive/root/thumbnails",
    "responseHeaders": {
        "Transfer-Encoding": [
            "chunked"
        ],
        "Vary": [
            "Accept-Encoding"
        ],
        "request-id": [
            "<id>"
        ],
        "client-request-id": [
            "<id>"
        ],
        "x-ms-ags-diagnostic": [
            "{\"ServerInfo\":{\"DataCenter\":\"North Central US\",\"Slice\":\"SliceC\",\"Ring\":\"1\",\"ScaleUnit\":\"000\",\"RoleInstance\":\"<stuff>\",\"ADSiteName\":\"<stuff>\"}}"
        ],
        "OData-Version": [
            "4.0"
        ],
        "Duration": [
            "259.0577"
        ],
        "Strict-Transport-Security": [
            "max-age=31536000"
        ],
        "Cache-Control": [
            "private"
        ],
        "Date": [
            "Thu, 19 Sep 2019 14:06:27 GMT"
        ]
    },
    "statusCode": "OK"
}

1 Ответ

1 голос
/ 19 сентября 2019

Так что я смог туда добраться, если кто-то знает более простой способ, и я действительно это ценю.Вот шаги, которые я предпринял:

1) Аутентифицирован с моим пользователем и загрузил информацию, используя URL-адрес общего доступа:

 string sharingUrl = "<url>";
 string base64Value = System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(sharingUrl));
 string encodedUrl = "u!" + base64Value.TrimEnd('=').Replace('/', '_').Replace('+', '-');                        
 var shares = await this.graphClient.Shares[encodedUrl].Root.Request().Expand(expandValue).GetAsync();

Как только я получил ответ, я заметил «driveId»для езды.Затем, когда я проверяю подлинность с помощью моего конфиденциального клиента, я могу указать диск в своем запросе:

await this.graphClient.Drives["<driveId from 1>"].Root.Request().Expand(expandValue).GetAsync()

Мне интересно, есть ли более простой способ найти эти DriveId, например, с сайта sharepoint?

Кроме того, похоже, что когда я получаю ссылку общего доступа из Sharepoint, если я переключаю ссылку с «определенных людей» на «Люди в», то я могу использовать общие ресурсы для получения элементов диска.

...