OneDrive'i API kasutamine kasutaja sekkumiseta (nt pakkprogramm (.NET C# versioon) (täiendavaid kasutusteeke pole)

Lehekülg uuendatud :
Lehe loomise kuupäev :

Töökeskkond

Visuaalne stuudio
  • Visual Studio 2022
.NET
  • .NET 8
Microsofti autentimise API
  • 2.0 OAuth 2
Microsoft OneDrive API
  • 1.0
Microsofti kontode tüübid
  • Töö- või koolikonto

Eeltingimused

Visuaalne stuudio
  • Üks versioonidest
.NET
  • Üks versioonidest
Microsofti autentimise API
  • 2.0 OAuth 2
Microsoft OneDrive API
  • 1.0
Microsofti kontode tüübid
  • Töö- või koolikonto

Selle sündmuse eesmärgi kohta

Nüüd saate OneDrive'i API-de abil valmistada teid ette failide programmiliseks OneDrive'i üles- ja allalaadimiseks. Selles artiklis käsitleme seda, mida saate OneDrive'i API-ga teha, nii et me ei käsitle seda, mida saate OneDrive'i API-ga teha. Kuid seni, kuni saate ühenduse luua, saate lugeda API dokumentatsiooni ja rakendada seda pärast seda.

Kuidas programmi käivitada

Juurdepääs OneDrive'ile ei sõltu programmi vormist (nt veebirakendus, töölauarakendus või konsoolirakendus) ja seda saab käivitada mitmesuguste programmide abil. Sel juhul loome konsoolirakenduse ja käivitame selle automaatselt ilma kasutaja toiminguteta.

Millised on Microsofti kontode eri tüübid?

Kui olete kunagi loonud Microsofti konto, olete seda tõenäoliselt näinud. Microsofti kontosid on kahte tüüpi: isiklikud Microsofti kontod ja töö- või koolikontod. OneDrive on seotud Microsofti kontoga, kuid OneDrive'i tüüp varieerub veidi sõltuvalt eespool loetletud konto tüübist.

Praegu saab OneDrive'i API-t kasutada mõlemat tüüpi kontodega. Selles programmis kujul "loodud konsoolirakendusena ja teostatud ilma kasutaja operatsioonita", Pange tähele, et seda saab kasutada ainult Microsofti kontoga "Töö- või koolikonto" kontol. Selle põhjuseks on autentimismeetodite erinevused.

Autentimismeetodi kohta

Esiteks peate OneDrive'ile programmiliselt juurde pääsemiseks autentima. Nagu eespool mainitud, pääseb iga programm OneDrive'i juurde, kuid autentimine API-ga ühenduse loomiseks sõltub programmi tööst. Veebirakendusi ja töölauarakendusi saab autentida kasutaja sekkumise teel. Kuna kasutaja ei saa seda taustal töötavas konsoolirakenduses kasutada, erineb ka autentimismeetod ülaltoodust.

Ma ei tea üksikasjalikku põhjust, sest ma pole suutnud seda üles otsida, kuid kui see meelde tuleb, näib see olevat tingitud turvalisusest ja kontohaldusest. Võin ainult öelda, et see on juba spetsifikatsioon, nii et kui soovite programmiliselt juurde pääseda OneDrive'ile, mis on seotud "isikliku Microsofti kontoga", Ma arvan, et ei ole muud valikut, kui kasutada muud programmi kui taustal töötav programm või käivitada konsoolirakendus autentimismeetodiga, mis sisaldab kasutaja toiminguid.

Me ei kasuta praegu teeki OneDrive'i API-le juurdepääsemiseks

Juurdepääsu OneDrive'i API-le on suhteliselt lihtne käsitseda, kasutades teeki nimega "Microsoft Graph". Sel juhul kasutame API URL-ile otse juurdepääsu ja selle käivitamise meetodit. See on natuke tülikas, kuid kuna see ei kasuta teeki, on selle eeliseks see, et non-.NET programmid pääsevad OneDrive'i API-le juurde samal viisil. Samuti hoiab see ära puuduse, et kood muutub raamatukogu erinevate versioonide tõttu.

Teises nõuandes näitame teile, kuidas Microsoft Graphi kasutada.

eeltingimus

  • Teil on Microsofti konto töö- või koolikonto jaoks
  • Saate kasutada ülalloetletud Microsofti kontoga seotud OneDrive'i (nt OneDrive Business)
  • Visual Studio 2022 on installitud

Rakenduse häälestamine Microsofti kontole või OneDrive'ile juurdepääsemiseks Azure'is

Logige Azure'i sisse järgmisel URL-il:

Tippige ülalolevalt otsinguväljalt "rakenduste registreerimised" ja valige see.

Klõpsake nuppu Uus registreerimine.

"Nime" sisu on meelevaldne. Palun sisestage kirjeldav nimi.

Valige muu "Toetatud konto tüüp" kui "Ainult isiklikud Microsofti kontod". Seda seetõttu, et nagu eespool mainitud, saab seda autentimist kasutada ainult organisatsioonile kuuluvate kontodega. Sel juhul oleme valinud "Kontod mis tahes organisatsioonikataloogis (mis tahes Microsoft Entra ID rentnik – mitme rentnikuga) ja isiklikud Microsofti kontod (Skype, Xbox jne)".

Te ei pea sisestama "Suuna URI ümber", sest seda seekord ei kasutata.

Kui olete lõpetanud, klõpsake nuppu "Registreeru".

Teid suunatakse loodud rakenduse registreerimise kokkuvõttelehele, seega kopeerige rakenduse (kliendi) ID ja kataloogi (rentniku) ID. Seda väärtust saate hiljem kasutada.

Valige vasakpoolses menüüs halduskategooriast "Sertifikaadid ja saladused" ja veenduge, et keskmisel vahekaardil oleks valitud "Kliendi saladused". Klõpsake nuppu Uus kliendisaladus.

Kirjelduse sisestamine on valikuline. Kui soovite selle kasutamist jätkata, lisage palun selgitus, mis selgitab selgelt kasutamise eesmärki.

"Aegumiskuupäev" on ajavahemik, mille jooksul see kliendi saladus kehtib. Kuna see on seekord testimise eesmärgil, on see 90 päeva, kuid palun määrake see vastavalt kasutuseesmärgile.

Kui loote kliendi saladuse, lisatakse see loendisse. Selles kasutame väärtust veerus "Väärtus", nii et kopeerige see. Pange tähele, et seda väärtust ei saa hiljem kopeerida.

Seejärel valige vasakpoolses menüüs administraatorikategooriast "API õigused" ja klõpsake keskel "Lisa õigused".

Klõpsake API loataotluses nuppu Microsoft Graph.

Klõpsake nuppu Luba rakendus. See suvand pole saadaval isiklike Microsofti kontode puhul.

Allpool kuvatakse õiguste loend, seega kasutage järgmiste üksuste kontrollimiseks otsinguvälja.

  • Files.ReadWrite.All

Sellest piisab, kui soovite kasutada ainult OneDrive'i, kuid kui soovite millelegi muule juurde pääseda, lisage õigused. OneDrive'ile juurdepääsuks vajalikud õigused leiate allolevalt ametlikult lehelt.

Kui olete oma valikud teinud, klõpsake nuppu Lisa õigused.

Lisatud üks lisatakse loendisse ja "Tüüp" on "Rakendus". Kuna aga "Staatus" on "Ei ole antud XXXX-le", klõpsake "Anna administraatori nõusolek XXXX-le". (XXXX on teie organisatsiooni nimi)

Klõpsake nuppu Jah.

See muutub antud olekuks.

Muide, saate kustutada "delegeeritud kasutaja.Loe", mis on seal algusest peale, sest me ei kasuta seda seekord. Kui lisasite rakendusena "User.Read", kasutage seda.

Kasutaja ID kinnitamine

Kuna pääsete juurde sihtkasutaja OneDrive'ile, kontrollige eelnevalt kasutaja ID-d.

Microsoft Entra ID ja avage see.

Valige vasakpoolsest menüüst Kasutajad.

Kuvatakse kasutajate loend, nii et klõpsake sihtkasutajal.

Märkige üles "Objekti ID", kuna see on kasutaja ID.

Looge konsoolirakendus

Käivitage Visual Studio ja looge oma konsoolirakendusele projekt. Saate selle luua väljaspool Visual Studiot, kuid ma kasutan praegu Visual Studiot.

Asukoht ja projekti nimi on valikulised. Sel juhul on OneDriveApiDotNetClientCredentialsHttpClient projekti nimi .

Seekord me koodi ei jaga, vaid Program.cs kirjutame selle ülevalt järk-järgult, nii et kui saate liikumist kontrollida, kirjutage see ümber, jagades koodi vastavalt vajadusele.

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

Kirjeldage nimeruumi, mida soovite kasutada.

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

Seda klassi kasutatakse tõendi teabe saamiseks pärast autentimist. Program.cs , palun kirjutage see koodi lõppu. Selle klassi saate eraldada teistesse failidesse.

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

See on maagiline meetod, mis vormindab API-st saadud JSON-teksti taandega. Kuna see on Internetist korjatud kood, ei selgita ma sisu üksikasjalikult.

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

Määrake iga jaoks Azure'ist saadud ID. accessToken on ajutine luba OneDrive'ile juurdepääsuks, nii et see on seatud käitusajale.

// 各種 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";

Autentimise API URL ja API URL, et saada OneDvie juurest kaustade loend. See on kirjeldus selle kohta, kuidas kontrollida juurdepääsu OneDrive'i API-le, nii et ma ei kirjelda OneDrive'i API sisu. Kui teil on juurdepääs OneDrive'i API-le, on üleslaadimine ja allalaadimine rakendus, nii et ma ei usu, et see on nii keeruline.

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

Olete loonud taotluse esitamiseks määratud URL-ile HttpClient .

// 「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}");

Kõigepealt esitate autentimise API-le andmetega taotluse, seega valmistage need andmed ette. Saadetavate andmete vorming on päringu parameetristring vormingus "Name1=Value1&Name2=Value2...", nii et see luuakse sõnastikus ja teisendatakse seejärel päringu parameetristringiks.

Saata tuleb neli parameetrit:

näide
Parameetri nime väärtuste
client_id Määrake kliendi ID, mille hankisite rakenduse registreerimisel.
ulatus Autentimine kliendi saladusega on fikseeritud https://graph.microsoft.com/.default .
client_secret Määrake rakenduse registreerimisel saadud kliendisaladuse väärtus.
grant_type Kuna see on autentimine kliendi saladusega, client_credentials on see

Lisateabe saamiseks vaadake palun järgmist ametlikku veebisaiti.

// 認証処理
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 autentimise API-le päringu tegemiseks. HttpClient See on tavaline kasutus, nii et ma ei usu, et seal on palju tähelepanu pöörata.

Saadetavad andmed peavad olema UTF8 kodeeritud ja sisutüüp peab olema application/x-www-form-urlencoded . Meetod on POST .

IsSuccessStatusCode Kui vastust kontrollitakse ja töödeldakse edukalt, saate tulemuse JSON-stringina. Saadud JSON-il on järgmised parameetrid:

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

Selles access_token kasutame . Kasutage seda väärtust OneDrive'i API-ga. Võite teisi parameetreid ignoreerida, kuidaccess_token kui soovite teada aegumiskuupäeva , kasutage expires_in .

JSON-stringina on seda raske kasutada, nii et JsonSerializer.Deserialize me deserialiseerime selle ja siis access_token saame .

// 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)}");
}

Lõpuks kasutage pääsuluba OneDrive'i API-le taotluse esitamiseks. Meetod määrab GET , kuid see sõltub API tüübist, seega kontrollige OneDrive API dokumentatsiooni.

Lisage päisesse pääsuluba. Määrake võti vormingus Authorization Bearer {アクセストークン} ja väärtus .

Kõik, mida pead tegema, on esitada taotlus ja saada tulemus JSON-stringina. Nüüd, kui me lihtsalt veendume, et meil on juurdepääs OneDrive'i API-le, vormindame lihtsalt JSON-stringi ja prindime selle konsooli. Tegelikult deserialiseerib see vastuvõetud JSON-i ja töötleb seda vastavalt.

Olen seekord saanud kaustade loendi, kuid arvan, et JSON on järgmine.

{
  "@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": "フォルダ名"
      }
    },
    :
  ]
}

Ma ei usu, et vajate kogu teavet, nii et kui soovite näiteks saada ainult kausta nime, saate value massiivist name ainult parameetrid .

Kokkuvõte

Kui see töötab siiani hästi, peaksite saama OneDrive'ile juurde pääseda pakettprogrammiga. Ma ei tea, kas näpunäited võtavad kokku üleslaadimise ja allalaadimise meetodid, kuid põhimõtteliselt peaks see toimima, kui rakendate ülalkirjeldatud juurkaustade loendit. API-de tüübid on kokku võetud alloleval ametlikul veebisaidil, nii et palun leidke API, mida soovite kasutada, ja rakendage see.

Tänud

Mul oli seekord OneDrive'i API kasutamise kohta küsimusi, nii et esitasin küsimuse.