Використовуйте API OneDrive без взаємодії з користувачем, наприклад пакетну програму (версія .NET C#) (без додаткового використання бібліотек)

Сторінка оновлюється :
Дата створення сторінки :

Робоче середовище

Візуальна студія
  • Visual Studio 2022
.МЕРЕЖІ
  • .NET 8
API автентифікації Microsoft
  • 2.0 OAuth 2
Microsoft OneDrive API
  • 1.0
Типи облікових записів Microsoft
  • Робочий або навчальний обліковий запис

Передумови

Візуальна студія
  • Одна з версій
.МЕРЕЖІ
  • Одна з версій
API автентифікації Microsoft
  • 2.0 OAuth 2
Microsoft OneDrive API
  • 1.0
Типи облікових записів Microsoft
  • Робочий або навчальний обліковий запис

Про мету цього заходу

Тепер ви використовуватимете API OneDrive, щоб підготуватися до програмного передавання та вивантаження файлів у OneDrive. У цій статті ми розглянемо, що можна робити за допомогою OneDrive API, тому не будемо вдаватися в те, що можна робити за допомогою OneDrive API. Однак, поки ви можете підключитися, ви можете прочитати документацію API та застосувати її після цього.

Як запустити програму

Доступ до OneDrive не залежить від форми програми, наприклад веб-програми, настільної програми або консольної програми, і може запускатися різними програмами. У цьому випадку ми створимо консольний додаток і виконаємо його в автоматичному режимі без будь-яких дій користувача.

Які існують типи облікових записів Microsoft?

Якщо ви коли-небудь створювали обліковий запис Microsoft, ви напевно бачили його. Існує два основних типи облікових записів Microsoft: особисті облікові записи Microsoft і робочі або навчальні облікові записи. OneDrive прив'язаний до облікового запису Microsoft, але тип OneDrive дещо відрізняється залежно від типу облікового запису, переліченого вище.

На даний момент OneDrive API можна використовувати з обома вищезазначеними типами облікових записів. У цій програмі у вигляді "створюється як консольний додаток і виконується без дій користувача", Зверніть увагу, що його можна використовувати лише з обліковим записом Microsoft в обліковому записі "Робочий або навчальний обліковий запис". Це пов'язано з відмінностями в методах аутентифікації.

Про метод автентифікації

По-перше, ви повинні пройти автентифікацію, щоб отримати доступ до OneDrive програмним шляхом. Як згадувалося вище, будь-яка програма може отримати доступ до OneDrive, але аутентифікація для підключення до API залежить від того, як працює програма. Веб-додатки та десктопні програми можуть бути автентифіковані шляхом взаємодії з користувачем. Оскільки користувач не може керувати ним у консольному додатку, який працює у фоновому режимі, метод аутентифікації також відрізняється від вищеописаного.

Я не знаю детальної причини, тому що я не зміг її знайти, але якщо це спадає на думку, здається, це пов'язано з безпекою та управлінням обліковим записом. Можу лише сказати, що це вже специфікація, тому якщо ви хочете програмно отримати доступ до OneDrive, пов'язаного з "особистим обліковим записом Microsoft", Я думаю, що немає іншого вибору, як використовувати програму, відмінну від тієї, яка працює у фоновому режимі, або запустити консольний додаток з методом аутентифікації, який включає операції користувача.

Наразі ми не використовуватимемо бібліотеку для доступу до API OneDrive

Доступ до API OneDrive відносно простий у використанні бібліотеки під назвою «Microsoft Graph». У цьому випадку ми будемо використовувати метод безпосереднього звернення до URL API та його виконання. Він трохи громіздкий, але оскільки він не використовує бібліотеку, він має перевагу в тому, що non-.NET програми можуть отримувати доступ до API OneDrive таким же чином. Це також запобігає тому недоліку, що код змінюється через різні версії бібліотеки.

Ми розповімо вам, як користуватися Microsoft Graph в іншій пораді.

Передумовою

  • У вас є обліковий запис Microsoft для робочого або навчального облікового запису
  • Ви можете використовувати OneDrive, пов'язаний із переліченим вище обліковим записом Microsoft (наприклад, OneDrive Business)
  • Встановлено Visual Studio 2022

Налаштуйте програму для доступу до облікового запису Microsoft або OneDrive в Azure

Увійдіть в Azure за такою URL-адресою:

У полі пошуку вище введіть «реєстрація програм» і виберіть його.

Натисніть Нова реєстрація.

Зміст «Найменування» довільний. Будь ласка, введіть описову назву.

Виберіть "Підтримуваний тип облікового запису", відмінний від "Лише особисті облікові записи Microsoft". Це пов'язано з тим, що, як згадувалося вище, цю аутентифікацію можна використовувати лише з обліковими записами, які належать організації. В даному випадку ми вибрали "Облікові записи в будь-якому каталозі організації (будь-який клієнт Microsoft Entra ID - мультитенант) і особисті облікові записи Microsoft (Skype, Xbox і т.д.)".

Вам не потрібно вводити "Redirect URI", тому що цього разу він не буде використовуватися.

Коли ви закінчите, натисніть кнопку «Зареєструватися».

Ви перейдете на сторінку підсумку створеної реєстрації програми, тому скопіюйте ідентифікатор програми (клієнта) та ідентифікатор каталогу (клієнта). Ви використаєте це значення пізніше.

Виберіть «Сертифікати та секрети» з категорії управління в лівому меню, а в середній вкладці переконайтеся, що вибрано «Секрети клієнтів». Натисніть Секрет нового клієнта.

Введення опису необов'язкове. Якщо ви хочете продовжувати користуватися ним, будь ласка, додайте пояснення, яке чітко пояснює мету використання.

«Термін придатності» - це проміжок часу, протягом якого ця секретна інформація клієнта є дійсною. Оскільки цього разу він призначений для тестування, він становить 90 днів, але, будь ласка, встановіть його відповідно до мети використання.

Коли ви створюєте секрет клієнта, він додається до списку. При цьому ми будемо використовувати значення в стовпці "Value", тому скопіюйте його. Зауважте, що це значення не можна скопіювати пізніше.

Далі виберіть «Дозволи API» з категорії «Адміністрування» в лівому меню та натисніть «Додати дозволи» посередині.

У запиті дозволу API натисніть Microsoft Graph.

Натисніть Дозволити програму. Цей параметр недоступний для особистих облікових записів Microsoft.

Нижче буде відображено список дозволів, тому використовуйте поле пошуку, щоб перевірити наступні пункти.

  • Файли.ReadWrite.All

Цього достатньо, якщо ви хочете використовувати лише OneDrive, але якщо ви хочете отримати доступ до будь-чого іншого, додайте дозволи. Дозволи, необхідні для доступу до OneDrive, можна знайти на офіційній сторінці нижче.

Зробивши свій вибір, натисніть кнопку «Додати дозволи».

Доданий додається до списку, а "Тип" - це "Застосування". Однак, оскільки в полі "Статус" "Не надано ХХХХ", натисніть "Надати згоду адміністратора ХХХХ". (ХХХХ – назва Вашої організації)

Натисніть Так.

Вона змінюється на надану державу.

До речі, ви можете видалити "delegated User.Read", який є там з самого початку, тому що цього разу ми не будемо його використовувати. Якщо ви додали "User.Read" як програму, використовуйте її.

Підтвердження ідентифікаторів користувачів

Оскільки ви будете отримувати доступ до OneDrive, який має цільовий користувач, перевірте ідентифікатор користувача заздалегідь.

Microsoft Entra ID і відкрийте його.

Виберіть Користувачі в меню ліворуч.

З'явиться список користувачів, тому натисніть на цільового користувача.

Запишіть "Object ID", оскільки це буде ID користувача.

Створення консольного додатку

Запустіть Visual Studio та створіть проект для вашої консольної програми. Ви можете створити його за межами Visual Studio, але я поки що використовую Visual Studio.

Місце розташування та назва проекту не є обов'язковими. У цьому випадку назва проекту - OneDriveApiDotNetClientCredentialsHttpClient .

Цього разу ми не будемо ділити код, а Program.cs запишемо його в шаховому порядку зверху, тому, якщо ви можете перевірити рух, будь ласка, перепишіть його, розділивши код за потреби.

using System.Runtime.Serialization.Json;
using System.Text;
using System.Text.Json;
using System.Web;
using System.Xml;

Опишіть простір імен, який ви хочете використовувати.

// 認証結果を格納するクラスです
public record TokenResponse(string token_type, int expires_in, int ext_expires_in, string access_token);

Цей клас використовується для отримання інформації про токени після аутентифікації. Program.cs , будь ласка, напишіть це в кінці коду. Ви можете розділити цей клас на інші файли.

// JSON 文字列を整形するメソッド
static string ConvertToIndentedJson(string json)
{
  byte[] buffer = Encoding.UTF8.GetBytes(json);
  using MemoryStream stream = new();
  using XmlDictionaryWriter writer = JsonReaderWriterFactory.CreateJsonWriter(stream, Encoding.UTF8, true, true);
  using XmlDictionaryReader reader = JsonReaderWriterFactory.CreateJsonReader(buffer, XmlDictionaryReaderQuotas.Max);
  writer.WriteNode(reader, true);
  writer.Flush();
  return Encoding.UTF8.GetString(stream.ToArray());
}

Це чарівний метод, який форматує отриманий з API текст JSON з відступом. Оскільки це код, взятий з інтернету, я не буду детально пояснювати зміст.

// 各種 ID などの定義
var clientId = "XXXXXXXX";      // クライアント ID
var tenantId = "XXXXXXXX";      // テナント ID
var clientSecret = "XXXXXXXX";  // クライアント シークレット
var userId = "XXXXXXXX";        // ユーザー ID
var accessToken = "";           // アクセストークン

Встановіть ідентифікатор, отриманий в Azure, для кожного. accessToken – це тимчасовий токен для доступу до OneDrive, тому він встановлюється під час виконання.

// 各種 URL の定義
var urlToken = $"https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token";
var urlOneDriveGetRootFolders = $"https://graph.microsoft.com/v1.0/users/{userId}/drive/root/children";

URL-адреса API для автентифікації та URL-адреса API для отримання списку папок у корені OneDvie. Це опис того, як перевірити доступ до OneDrive API, тому я не буду описувати вміст OneDrive API. Якщо у вас є доступ до OneDrive API, завантаження та скачування – це програма, тому я не думаю, що це так складно.

// 使いまわすので最初に定義しておく
HttpClient httpClient = new();

Ви згенерували запит на HttpClient вказаний URL.

// 「Name1=Value1&Name2=Value2...」形式のクエリパラメータ文字列を作成する
var valueDict = new Dictionary<string, string>
{
    { "client_id", clientId },
    { "scope", "https://graph.microsoft.com/.default" },
    { "client_secret", clientSecret },
    { "grant_type", "client_credentials" },
};
var valueQS = string.Join("&", valueDict.Select(x => string.Format("{0}={1}", x.Key, HttpUtility.UrlEncode(x.Value))));
Console.WriteLine($"valueQS={valueQS}");

Спочатку ви зробите запит до API автентифікації з даними, тому підготуйте ці дані. Формат даних, які потрібно надіслати, є рядком параметра запиту у форматі "Name1=Value1&Name2=Value2...", тому він створюється у словнику, а потім перетворюється на рядок параметра запиту.

Є чотири параметри, які потрібно надіслати:

Приклад значень назви параметра
client_id Встановіть ідентифікатор клієнта, який ви отримали під час реєстрації в додатку.
Масштаб Виправлена https://graph.microsoft.com/.default аутентифікація з секретом клієнта .
client_secret Встановіть значення секрету клієнта, яке ви отримали під час реєстрації в додатку.
grant_type Оскільки це аутентифікація з секретом клієнта, client_credentials це буде

Для отримання додаткової інформації, будь ласка, зверніться до наступного офіційного веб-сайту.

// 認証処理
using (HttpRequestMessage request = new(HttpMethod.Post, urlToken))
{
  request.Content = new StringContent(valueQS, Encoding.UTF8, "application/x-www-form-urlencoded");

  // データを送信し結果を受け取る
  using var response = httpClient.SendAsync(request).Result;

  Console.WriteLine($"IsSuccessStatusCode={response.IsSuccessStatusCode}");
  Console.WriteLine($"StatusCode={response.StatusCode}");
  Console.WriteLine($"ReasonPhrase={response.ReasonPhrase}");

  if (response.IsSuccessStatusCode == false)
  {
    Console.WriteLine("トークンの取得に失敗しました。");
    return;
  }

  // レスポンスからアクセストークンを受け取る。
  var tokenResultJson = response.Content.ReadAsStringAsync().Result;
  Console.WriteLine($"tokenResultJson={ConvertToIndentedJson(tokenResultJson)}");

  var tokenResult = JsonSerializer.Deserialize<TokenResponse>(tokenResultJson) ?? throw new Exception("JSON をデシリアライズできませんでした。");
  accessToken = tokenResult.access_token;
}

HttpClient щоб зробити запит до API автентифікації. HttpClient Це звичайне використання, тому я не думаю, що є на що звертати увагу.

Дані, які потрібно відправити, повинні бути закодовані в UTF8, а Content-Type повинен бути application/x-www-form-urlencoded . Метод полягає в тому, POST що .

IsSuccessStatusCode Якщо відповідь перевірено та оброблено успішно, ви отримаєте результат у вигляді рядка JSON. Отриманий JSON має такі параметри:

{
  "token_type": "Bearer",
  "expires_in": 3599,
  "ext_expires_in": 3599,
  "access_token": "XXXXXXXXXXXXXXX"
}

При цьому access_token ми будемо використовувати . Використовуйте це значення з API OneDrive. Інші параметри можна ігнорувати, алеaccess_token якщо ви хочете дізнатися термін придатності , використовуйте expires_in .

Його важко використовувати як рядок JSON, тому JsonSerializer.Deserialize ми десеріалізуємо його за допомогою і потім access_token отримуємо .

// OneDrive 処理
using (HttpRequestMessage request = new(HttpMethod.Get, urlOneDriveGetRootFolders))
{
  // アクセストークンをヘッダーに追加する
  request.Headers.Add("Authorization", "Bearer " + accessToken);

  // OneDrive API にリクエスト
  using var response = httpClient.SendAsync(request).Result;

  Console.WriteLine($"IsSuccessStatusCode={response.IsSuccessStatusCode}");
  Console.WriteLine($"StatusCode={response.StatusCode}");
  Console.WriteLine($"ReasonPhrase={response.ReasonPhrase}");

  if (response.IsSuccessStatusCode == false)
  {
    Console.WriteLine("OneDrive へのアクセスに失敗しました。");
    return;
  }

  // レスポンスからアクセストークンを受け取る。
  var apiResultJson = response.Content.ReadAsStringAsync().Result;
  Console.WriteLine($"apiResultJson={ConvertToIndentedJson(apiResultJson)}");
}

Нарешті, за допомогою маркера доступу зробіть запит до API OneDrive. Метод вказує GET , але це залежить від типу API, тому перевірте документацію OneDrive API.

Додайте токен доступу до заголовка. Встановіть ключ як Authorization і значення у форматі Bearer {アクセストークン} .

Все, що вам потрібно зробити, це зробити запит і отримати результат у вигляді рядка JSON. Тепер, коли ми тільки переконуємося, що у нас є доступ до API OneDrive, ми просто форматуємо рядок JSON і друкуємо його на консолі. Фактично, він десеріалізує отриманий JSON і обробляє його відповідним чином.

Цього разу я отримав список папок, але я думаю, що JSON виглядає наступним чином.

{
  "@odata.context": "https:\/\/graph.microsoft.com\/v1.0\/$metadata#Collection(driveItem)",
  "value": [
    {
      "@microsoft.graph.Decorator": "decorator has been deprecated. Refer to folder.decorator",
      "createdBy": {
        "フォルダ作成者の情報":""
      },
      "createdDateTime": "2017-06-20T04:31:24Z",
      "eTag": "\"{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX},1\"",
      "id": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
      "lastModifiedBy": {
        "フォルダ更新者の情報":""
      },
      "lastModifiedDateTime": "2017-06-20T04:31:24Z",
      "name": "フォルダ名",
      "parentReference": {
        "親フォルダの情報":""
      },
      "webUrl": "フォルダにアクセスできる URL",
      "cTag": "\"c:{5926E2DA-B7FF-4936-88A8-7908C378ECE2},0\"",
      "fileSystemInfo": {
        "createdDateTime": "2017-06-20T04:31:24Z",
        "lastModifiedDateTime": "2017-06-20T04:31:24Z"
      },
      "folder": {
        "childCount": 0
      },
      "size": 0,
      "specialFolder": {
        "name": "フォルダ名"
      }
    },
    :
  ]
}

Я не думаю, що вам потрібна вся інформація, тому якщо ви хочете отримати тільки ім'я папки, наприклад, ви value можете отримати тільки параметри з name масиву в .

Зведення

Якщо досі він працює нормально, ви зможете отримати доступ до OneDrive за допомогою пакетної програми. Не знаю, чи узагальнюють поради способи вивантаження і скачування, але в основному це повинно спрацювати, якщо застосувати список папок в кореневі, описаний вище. Типи API узагальнені на офіційному сайті нижче, тому, будь ласка, знайдіть API, який ви хочете використовувати, і впровадьте його.

Дякую

Цього разу у мене виникли запитання щодо використання OneDrive API, тому я поставив запитання.