Uporabite API za OneDrive brez interakcije uporabnika, na primer paketni program (različica .NET C#) (brez dodatnih knjižnic za uporabo)

Stran posodobljena :
Datum ustvarjanja strani :

Delovno okolje

Visual Studio
  • Visual Studio 2022
.MREŽA
  • .NET 8
Microsoftov API za preverjanje pristnosti
  • 2.0 OAuth 2
Microsoft OneDrive API
  • 1.0
Vrste Microsoftovih računov
  • Službeni ali šolski račun

Predpogoji

Visual Studio
  • Ena od različic
.MREŽA
  • Ena od različic
Microsoftov API za preverjanje pristnosti
  • 2.0 OAuth 2
Microsoft OneDrive API
  • 1.0
Vrste Microsoftovih računov
  • Službeni ali šolski račun

O namenu tega dogodka

Zdaj se boste z API-ji storitve OneDrive pripravili na programsko nalaganje in prenos datotek v OneDrive. V tem članku bomo obravnavali, kaj lahko naredite z API-jem za OneDrive, zato se ne bomo spuščali v to, kaj lahko naredite z API-jem za OneDrive. Dokler pa se lahko povežete, lahko preberete dokumentacijo API-ja in jo uporabite po tem.

Kako zagnati program

Dostop do storitve OneDrive ni odvisen od oblike programa, kot je spletna aplikacija, namizna aplikacija ali konzolna aplikacija, in ga lahko izvajajo različni programi. V tem primeru bomo ustvarili konzolno aplikacijo in jo samodejno izvedli brez kakršne koli uporabniške operacije.

Katere so različne vrste Microsoftovih računov?

Če ste že kdaj ustvarili Microsoftov račun, ste ga verjetno že videli. Obstajata dve glavni vrsti Microsoftovih računov: osebni Microsoftovi računi in službeni ali šolski računi. OneDrive je povezan z Microsoftovim računom, vendar se vrsta storitve OneDrive nekoliko razlikuje glede na zgoraj navedeno vrsto računa.

Za zdaj lahko API za OneDrive uporabljate z obema zgoraj navedenima vrstama računov. V tem programu v obliki "ustvarjena kot konzolna aplikacija in izvedena brez uporabniške operacije", Upoštevajte, da ga lahko uporabljate le z Microsoftovim računom v računu »Službeni ali šolski račun«. To je posledica razlik v metodah preverjanja pristnosti.

O načinu preverjanja pristnosti

Najprej morate preveriti pristnost, če želite programsko dostopati do storitve OneDrive. Kot je navedeno zgoraj, lahko vsak program dostopa do storitve OneDrive, vendar je preverjanje pristnosti za povezavo z API-jem odvisno od tega, kako se program izvaja. Spletne in namizne aplikacije je mogoče preveriti z interakcijo uporabnika. Ker ga uporabnik ne more upravljati v konzolni aplikaciji, ki deluje v ozadju, se tudi način preverjanja pristnosti razlikuje od zgoraj navedenega.

Ne poznam podrobnega razloga, ker ga nisem mogel poiskati, če pa pride na misel, se zdi, da je to zaradi varnosti in upravljanja računa. Lahko rečem le, da je to že specifikacija, tako da, če želite programsko dostopati do OneDrive, povezanega z "osebnim Microsoftovim računom", Mislim, da ni druge izbire, kot da uporabimo program, ki ni program, ki deluje v ozadju, ali da zaženemo konzolno aplikacijo z metodo preverjanja pristnosti, ki vključuje uporabniške operacije.

Trenutno ne bomo uporabljali knjižnice za dostop do API-ja za OneDrive

Dostop do API-ja za OneDrive je razmeroma enostaven za upravljanje s knjižnico, imenovano »Microsoft Graph«. V tem primeru bomo uporabili metodo neposrednega dostopa do URL-ja API-ja in njegovega izvajanja. To je nekoliko okorno, a ker ne uporablja knjižnice, ima prednost, da lahko non-.NET programi dostopajo do API-ja OneDrive na enak način. Prav tako preprečuje pomanjkljivost, da se koda spremeni zaradi različnih različic knjižnice.

V drugem nasvetu vam bomo pokazali, kako uporabljati Microsoft Graph.

Pogoj

  • Imate Microsoftov račun za službeni ali šolski račun
  • Uporabite lahko OneDrive, ki je povezan z zgoraj navedenim Microsoftovim računom (npr. OneDrive Business)
  • Nameščen je Visual Studio 2022

Nastavitev aplikacije za dostop do Microsoftovega računa ali storitve OneDrive v storitvi Azure

Prijavite se v Azure na tem URL-ju:

V zgornjem iskalnem polju vnesite »registracije aplikacij« in ga izberite.

Kliknite Nova registracija.

Vsebina "Imena" je poljubna. Vnesite opisno ime.

Izberite »Podprta vrsta računa«, ki ni »Samo osebni Microsoftovi računi«. Kot je navedeno zgoraj, se to preverjanje pristnosti lahko uporablja samo z računi, ki pripadajo organizaciji. V tem primeru smo izbrali »Računi v katerem koli organizacijskem imeniku (kateri koli najemnik Microsoft Entra ID - več najemnikov) in osebni Microsoftovi računi (Skype, Xbox itd.)«.

Ni vam treba vnesti »URI-ja za preusmeritev«, ker tokrat ne bo uporabljen.

Ko končate, kliknite gumb »Registriraj se«.

Preusmerjeni boste na stran s povzetkom registracije aplikacije, ki ste jo ustvarili, zato kopirajte ID aplikacije (odjemalca) in ID imenika (najemnika). To vrednost boste uporabili pozneje.

V kategoriji upravljanja v levem meniju izberite »Potrdila in skrivnosti« in se prepričajte, da je na srednjem zavihku izbrana možnost »Skrivnosti odjemalca«. Kliknite Nova skrivnost odjemalca.

Vnos opisa ni obvezen. Če ga želite še naprej uporabljati, vključite pojasnilo, ki jasno pojasnjuje namen uporabe.

»Datum poteka« je časovno obdobje, v katerem je ta skrivnost odjemalca veljavna. Ker je tokrat za namene testiranja, je 90 dni, vendar ga nastavite glede na namen uporabe.

Ko ustvarite skrivnost odjemalca, je dodana na seznam. Pri tem bomo uporabili vrednost v stolpcu »Vrednost«, zato jo kopirajte. Upoštevajte, da te vrednosti pozneje ni mogoče kopirati.

Nato v levem meniju izberite »Dovoljenja API« iz kategorije Administracija in na sredini kliknite »Dodaj dovoljenja«.

V zahtevi za dovoljenje za API kliknite Microsoft Graph.

Kliknite Dovoli aplikacijo. Ta možnost ni na voljo za osebne Microsoftove račune.

Spodaj bo prikazan seznam dovoljenj, zato uporabite iskalno polje, da preverite naslednje elemente.

  • Datoteke.ReadWrite.All

To je dovolj, če želite uporabljati samo OneDrive, če pa želite dostopati do česar koli drugega, dodajte dovoljenja. Dovoljenja, potrebna za dostop do storitve OneDrive, najdete na spodnji uradni strani.

Ko izberete izbiro, kliknite gumb Dodaj dovoljenja.

Dodana je dodana na seznam, »Vrsta« pa je »Aplikacija«. Ker pa je »Status« »Ni odobreno XXXX«, kliknite »Daj skrbniško soglasje XXXX«. (XXXX je ime vaše organizacije)

Kliknite Da.

Spremeni se v dodeljeno stanje.

Mimogrede, lahko izbrišete »delegirani User.Read«, ki je tam od začetka, ker ga tokrat ne bomo uporabili. Če ste kot aplikacijo dodali »User.Read«, jo uporabite.

Preverjanje ID-jev uporabnikov

Ker boste dostopali do storitve OneDrive, ki jo ima ciljni uporabnik, vnaprej preverite ID uporabnika.

Microsoft Entra ID in ga odprite.

V meniju na levi izberite Uporabniki.

Prikaže se seznam uporabnikov, zato kliknite ciljnega uporabnika.

Zabeležite si »ID predmeta«, saj bo to ID uporabnika.

Ustvarjanje konzolnega programa

Zaženite Visual Studio in ustvarite projekt za konzolno aplikacijo. Ustvarite ga lahko zunaj Visual Studia, vendar bom za zdaj uporabljal Visual Studio.

Lokacija in ime projekta sta izbirna. V tem primeru je OneDriveApiDotNetClientCredentialsHttpClient ime projekta .

Tokrat kode ne bomo razdelili, ampak Program.cs jo bomo napisali razporejeno od zgoraj, tako da, če lahko preverite gibanje, ga po potrebi prepišite tako, da kodo razdelite.

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

Opišite imenski prostor, ki ga želite uporabiti.

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

Ta razred se uporablja za prejemanje informacij o žetonu po preverjanju pristnosti. Program.cs , prosimo, napišite ga na koncu kode. Ta razred lahko ločite v druge datoteke.

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

To je čarobna metoda, ki oblikuje besedilo JSON, prejeto iz API-ja, z zamikom. Ker gre za kodo, ki je bila pobrana z interneta, ne bom podrobno razlagal vsebine.

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

Nastavite ID, pridobljen v storitvi Azure, za vsakega. accessToken je začasni žeton za dostop do storitve OneDrive, zato je nastavljen v času izvajanja.

// 各種 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-ja za preverjanje pristnosti in URL API-ja, da dobite seznam map v korenu OneDvie. To je opis, kako preveriti dostop do API-ja OneDrive, zato ne bom opisoval vsebine API-ja OneDrive. Če imate dostop do API-ja OneDrive, je nalaganje in prenos aplikacija, zato mislim, da ni tako težko.

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

Ustvarili ste a, da pošljete zahtevo na HttpClient določen 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}");

Najprej boste zahtevali API za preverjanje pristnosti s podatki, zato pripravite te podatke. Oblika podatkov, ki jih je treba poslati, je niz parametrov poizvedbe v obliki »Ime1=Vrednost1&Ime2=Vrednost2...«, zato se ustvari v slovarju in nato pretvori v niz parametrov poizvedbe.

Pošljete štiri parametre:

Primer
vrednosti imena parametrov
client_id Nastavite ID odjemalca, ki ste ga pridobili pri registraciji aplikacije.
Obseg Preverjanje pristnosti s skrivnostjo odjemalca je fiksno https://graph.microsoft.com/.default .
client_secret Nastavite vrednost skrivnosti odjemalca, ki ste jo pridobili pri registraciji programa.
grant_type Ker gre za preverjanje pristnosti s skrivnostjo odjemalca, client_credentials bo

Za več informacij glejte naslednjo uradno spletno stran.

// 認証処理
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 , da pošljete zahtevo API-ju za preverjanje pristnosti. HttpClient To je pogosta uporaba, zato mislim, da ni veliko pozornosti.

Podatki, ki jih je treba poslati, morajo biti kodirani v UTF8, vrsta vsebine pa mora biti application/x-www-form-urlencoded . Metoda je POST .

Če je odgovor uspešno preverjen in obdelan IsSuccessStatusCode , boste rezultat prejeli kot niz JSON. JSON, ki ga prejmete, ima te parametre:

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

Pri tem access_token bomo uporabili . To vrednost uporabite z API-jem za OneDrive. Druge parametre lahko prezrete, čeaccess_token pa želite vedeti datum poteka , uporabite expires_in .

Težko ga je uporabiti kot JSON niz, zato JsonSerializer.Deserialize ga deserializiramo z in nato access_token dobimo .

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

Na koncu uporabite žeton za dostop, da pošljete zahtevo za API storitve OneDrive. Metoda določa GET , vendar je odvisno od vrste API-ja, zato preverite dokumentacijo API-ja za OneDrive.

Dodajte žeton za dostop v glavo. Nastavite ključ kot in Authorization vrednost v obliki zapisa Bearer {アクセストークン} .

Vse, kar morate storiti, je, da pošljete zahtevo in prejmete rezultat kot niz JSON. Zdaj, ko se prepričamo, da imamo dostop do API-ja za OneDrive, samo formatiramo niz JSON in ga natisnemo v konzolo. Pravzaprav deserializira prejeti JSON in ga ustrezno obdela.

Tokrat sem prejel seznam map, vendar mislim, da je JSON naslednji.

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

Mislim, da ne potrebujete vseh informacij, zato, če želite na primer dobiti samo ime mape, lahko dobite value samo parametre iz name matrike v .

Povzetek

Če doslej deluje dobro, bi morali imeti dostop do storitve OneDrive s paketnim programom. Ne vem, ali nasveti povzemajo načine nalaganja in prenosa, vendar bi moralo v bistvu delovati, če uporabite seznam map v zgoraj opisanem korenu. Vrste API-jev so povzete na spodnji uradni spletni strani, zato poiščite API, ki ga želite uporabiti, in ga implementirajte.

hvala

Tokrat sem imel nekaj vprašanj o uporabi API-ja za OneDrive, zato sem zastavil vprašanje.