Използване на 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. В тази статия ще разгледаме какво можете да правите с API на OneDrive, така че няма да навлизаме в това, което можете да правите с API на OneDrive. Въпреки това, докато можете да се свържете, можете да прочетете документацията на API и да я приложите след това.

Как да стартирате програмата

Достъпът до OneDrive не зависи от формата на програмата, като например уеб приложение, настолно приложение или конзолно приложение, и може да се изпълнява от различни програми. В този случай ще създадем конзолно приложение и ще го изпълним автоматично без никаква потребителска операция.

Какви са различните типове акаунти в Microsoft?

Ако някога сте създавали акаунт в Microsoft, вероятно сте го виждали. Има два основни типа акаунти в Microsoft: лични акаунти в Microsoft и служебни или учебни акаунти. OneDrive е свързан с акаунт в Microsoft, но типът на OneDrive се различава леко в зависимост от типа акаунт, посочен по-горе.

Засега API на OneDrive може да се използва и с двата горепосочени типа акаунти. В тази програма под формата на "създадено като конзолно приложение и изпълнено без потребителска операция", Моля, имайте предвид, че може да се използва само с акаунт в 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 и др.)".

Не е необходимо да въвеждате "URI за пренасочване", защото този път той няма да се използва.

Когато сте готови, щракнете върху бутона "Регистрация".

Ще бъдете отведени до страницата с обобщение на регистрацията на приложението, която сте създали, така че копирайте ИД на приложение (клиент) и ИД на директория (клиент). Ще използвате тази стойност по-късно.

Изберете "Сертификати и тайни" от категорията за управление в лявото меню и се уверете, че "Клиентски тайни" е избрано в средния раздел. Щракнете върху Нова тайна на клиента.

Въвеждането на описание не е задължително. Ако искате да продължите да го използвате, моля, включете обяснение, което ясно обяснява целта на употребата.

"Датата на изтичане" е периодът от време, през който тази клиентска тайна е валидна. Тъй като този път е за тестови цели, това е 90 дни, но моля, задайте го според целта на употреба.

Когато създадете клиентска тайна, тя се добавя към списъка. В това ще използваме стойността в колоната "Стойност", така че я копирайте. Имайте предвид, че тази стойност не може да бъде копирана по-късно.

След това изберете "Разрешения за API" от категорията Администрация в лявото меню и щракнете върху "Добавяне на разрешения" в средата.

В заявката за разрешение за API щракнете върху Microsoft Graph.

Щракнете върху Разрешаване на приложението. Тази опция не е налична за лични акаунти в Microsoft.

По-долу ще се покаже списък с разрешения, така че използвайте полето за търсене, за да проверите следните елементи.

  • Файлове.ReadWrite.All

Това е достатъчно, ако искате да използвате само OneDrive, но ако искате да получите достъп до нещо друго, добавете разрешения. Разрешенията, необходими за достъп до OneDrive, могат да бъдат намерени на официалната страница по-долу.

След като направите своя избор, щракнете върху бутона Добавяне на разрешения.

Добавеният се добавя към списъка, а "Тип" е "Приложение". Въпреки това, тъй като "Статусът" е "Не е предоставен на XXXX", щракнете върху "Дайте съгласие на администратора за XXXX". (XXXX е името на вашата организация)

Щракнете върху Да.

Той се променя в предоставеното състояние.

Между другото, можете да изтриете "делегирания User.Read", който е там от самото начало, защото този път няма да го използваме. Ако сте добавили "User.Read" като приложение, използвайте го.

Потвърждаване на потребителски идентификатори

Тъй като ще имате достъп до OneDrive, с който разполага целевият потребител, проверете ИД на потребителя предварително.

Microsoft Entra 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());
}

Това е магически метод, който форматира JSON текста, получен от API, с отстъп. Тъй като това е код, взет от интернет, няма да обяснявам съдържанието подробно.

// 各種 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. Това е описание на това как да проверите достъпа до API на OneDrive, така че няма да описвам съдържанието на API на OneDrive. Ако имате достъп до API на OneDrive, качването и изтеглянето е приложение, така че не мисля, че е толкова трудно.

// 使いまわすので最初に定義しておく
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, а типът на съдържанието трябва да бъде 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, така че проверете документацията на API на OneDrive.

Добавете маркера за достъп към заглавката. Задайте ключа като 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, който искате да използвате, и го внедрете.

Благодаря

Този път имах някои въпроси относно използването на API на OneDrive, затова зададох въпрос.