Naudokite "OneDrive" API be vartotojo sąveikos, pvz., paketinę programą (.NET C# versija) (papildomai nenaudokite bibliotekų)

Puslapis atnaujintas :
Puslapio sukūrimo data :

Darbo aplinka

Vizualinė studija
  • "Visual Studio 2022"
.GRYNOJI
  • .NET 8
"Microsoft" autentifikavimo API
  • 2.0 OAuth 2
"Microsoft OneDrive" API
  • 1.0
"Microsoft" paskyrų tipai
  • Darbo arba mokymo įstaigos paskyra

Būtinosios sąlygos

Vizualinė studija
  • Viena iš versijų
.GRYNOJI
  • Viena iš versijų
"Microsoft" autentifikavimo API
  • 2.0 OAuth 2
"Microsoft OneDrive" API
  • 1.0
"Microsoft" paskyrų tipai
  • Darbo arba mokymo įstaigos paskyra

Apie šio renginio tikslą

Dabar naudosite "OneDrive" API, kad pasiruoštumėte programiškai nusiųsti ir atsisiųsti failus į "OneDrive". Šiame straipsnyje apžvelgsime, ką galite daryti su "OneDrive" API, todėl nenagrinėsime, ką galite daryti su "OneDrive" API. Tačiau tol, kol galite prisijungti, galite perskaityti API dokumentaciją ir pritaikyti ją po to.

Kaip paleisti programą

Prieiga prie "OneDrive" nepriklauso nuo programos formos, pvz., žiniatinklio taikomosios programos, darbalaukio programos arba konsolės taikomosios programos, ir ją gali paleisti įvairios programos. Tokiu atveju sukursime konsolės programą ir vykdysime ją automatiškai be jokios vartotojo operacijos.

Kokie yra skirtingi "Microsoft" paskyrų tipai?

Jei kada nors sukūrėte "Microsoft" paskyrą, tikriausiai ją matėte. Yra du pagrindiniai "Microsoft" paskyrų tipai: asmeninės "Microsoft" paskyros ir darbo arba mokymo įstaigos paskyros. "OneDrive" yra susieta su "Microsoft" paskyra, tačiau "OneDrive" tipas šiek tiek skiriasi priklausomai nuo aukščiau nurodyto paskyros tipo.

Šiuo metu "OneDrive" API galima naudoti su abiejų aukščiau nurodytų tipų paskyromis. Šioje programoje "sukurta kaip konsolės programa ir vykdoma be vartotojo veikimo", Atminkite, kad jį galima naudoti tik su "Microsoft" paskyra "Darbo arba mokymo įstaigos paskyroje". Taip yra dėl autentifikavimo metodų skirtumų.

Apie autentifikavimo metodą

Pirmiausia turite autentifikuoti, kad galėtumėte programiškai pasiekti "OneDrive". Kaip minėta pirmiau, bet kuri programa gali pasiekti "OneDrive", tačiau autentifikavimas prisijungti prie API priklauso nuo to, kaip programa veikia. Žiniatinklio ir darbalaukio programas galima autentifikuoti vartotojo sąveikos būdu. Kadangi vartotojas negali jo valdyti konsolės programoje, kuri veikia fone, autentifikavimo metodas taip pat skiriasi nuo aukščiau pateikto.

Nežinau išsamios priežasties, nes negalėjau jos ieškoti, bet jei tai ateina į galvą, atrodo, kad taip yra dėl saugumo ir paskyros valdymo. Galiu tik pasakyti, kad tai jau yra specifikacija, taigi, jei norite programiškai pasiekti "OneDrive", susietą su "asmenine" Microsoft "paskyra", Manau, kad nėra kito pasirinkimo, kaip tik naudoti kitą programą nei programa, kuri veikia fone, arba paleisti konsolės programą su autentifikavimo metodu, kuris apima vartotojo operacijas.

Šiuo metu nenaudosime bibliotekos "OneDrive" API pasiekti

Prieigą prie "OneDrive" API gana lengva valdyti naudojant biblioteką, vadinamą "Microsoft Graph". Tokiu atveju naudosime tiesioginės prieigos prie API URL ir jo vykdymo metodą. Tai šiek tiek sudėtinga, bet kadangi ji nenaudoja bibliotekos, jos pranašumas yra tas, kad non-.NET programos gali taip pat pasiekti OneDrive API. Tai taip pat apsaugo nuo trūkumo, kad kodas keičiasi dėl skirtingų bibliotekos versijų.

Kitame patarime parodysime, kaip naudoti "Microsoft Graph".

Prielaida

  • Turite "Microsoft" paskyrą, skirtą darbo arba mokymo įstaigos paskyrai
  • Galite naudoti "OneDrive", susietą su anksčiau nurodyta "Microsoft" paskyra (pvz., "OneDrive Business")
  • Įdiegta "Visual Studio 2022"

Taikomosios programos nustatymas, kad ji pasiektų "Microsoft" paskyrą arba "OneDrive" programoje "Azure"

Prisijunkite prie "Azure" šiuo URL:

Aukščiau esančiame paieškos lauke įveskite "programų registracijos" ir pasirinkite jį.

Spustelėkite Nauja registracija.

"Vardo" turinys yra savavališkas. Įveskite aprašomąjį pavadinimą.

Pasirinkite "Palaikomos paskyros tipą", o ne "Tik asmeninės "Microsoft" paskyros". Taip yra todėl, kad, kaip minėta pirmiau, šį autentifikavimą galima naudoti tik su paskyromis, kurios priklauso organizacijai. Tokiu atveju pasirinkome "Paskyros bet kuriame organizaciniame kataloge (bet kuris "Microsoft Entra ID" nuomotojas - keli nuomininkai) ir asmeninės "Microsoft" paskyros ("Skype", "Xbox" ir kt.)".

Jums nereikia įvesti "Redirect URI", nes šį kartą jis nebus naudojamas.

Baigę spustelėkite mygtuką "Registruotis".

Būsite nukreipti į sukurtos programos registracijos suvestinės puslapį, todėl nukopijuokite programos (kliento) ID ir katalogo (nuomotojo) ID. Šią reikšmę naudosite vėliau.

Kairiajame meniu valdymo kategorijoje pasirinkite "Sertifikatai ir paslaptys" ir įsitikinkite, kad viduriniame skirtuke pasirinkta "Kliento paslaptys". Spustelėkite Nauja kliento paslaptis.

Aprašo įvedimas yra neprivalomas. Jei norite toliau jį naudoti, įtraukite paaiškinimą, kuriame būtų aiškiai paaiškintas naudojimo tikslas.

"Galiojimo pabaigos data" yra laikotarpis, per kurį galioja ši kliento paslaptis. Kadangi šį kartą jis skirtas bandymams, tai yra 90 dienų, tačiau nustatykite jį pagal naudojimo tikslą.

Kai sukuriate kliento slaptąjį raktą, jis įtraukiamas į sąrašą. Čia naudosime reikšmę stulpelyje "Vertė", todėl nukopijuokite ją. Atminkite, kad šios reikšmės vėliau kopijuoti negalima.

Tada kairiajame meniu esančioje administravimo kategorijoje pasirinkite "API leidimai" ir viduryje spustelėkite "Pridėti leidimus".

API teisių užklausoje spustelėkite Microsoft Graph.

Spustelėkite Leisti programą. Ši parinktis negalima asmeninėse "Microsoft" paskyrose.

Toliau bus rodomas leidimų sąrašas, todėl naudokite paieškos lauką, kad patikrintumėte šiuos elementus.

  • Failai.ReadWrite.All

To pakanka, jei norite naudoti tik "OneDrive", bet jei norite pasiekti ką nors kita, pridėkite leidimus. Leidimus, reikalingus norint pasiekti "OneDrive", galite rasti toliau pateiktame oficialiame puslapyje.

Pasirinkę spustelėkite mygtuką Pridėti leidimus.

Pridėtas pridedamas prie sąrašo, o "Tipas" yra "Taikymas". Tačiau, kadangi "Būsena" yra "Nesuteikta XXXX", spustelėkite "Duoti administratoriaus sutikimą XXXX". (XXXX yra jūsų organizacijos pavadinimas)

Spustelėkite Taip.

Jis keičiasi į suteiktą valstybę.

Beje, galite ištrinti "deleguotą User.Read", kuris yra nuo pat pradžių, nes šį kartą jo nenaudosime. Jei kaip programą pridėjote "User.Read", naudokite ją.

Naudotojų ID patvirtinimas

Kadangi pasieksite "OneDrive", kurį turi tikslinis vartotojas, iš anksto patikrinkite vartotojo ID.

Microsoft Entra ID ir atidarykite.

pasirinkti Vartotojai iš meniu kairėje.

Bus rodomas vartotojų sąrašas, todėl spustelėkite tikslinį vartotoją.

Užsirašykite "Objekto ID", nes tai bus vartotojo ID.

Sukurkite konsolės programą

Paleiskite "Visual Studio" ir sukurkite konsolės programos projektą. Galite sukurti jį ne "Visual Studio", bet kol kas naudosiu "Visual Studio".

Vieta ir projekto pavadinimas yra pasirinktiniai. Tokiu atveju projekto pavadinimas yra OneDriveApiDotNetClientCredentialsHttpClient .

Šį kartą kodo neskirstysime, o Program.cs rašysime jį iš viršaus, todėl, jei galite patikrinti judesį, perrašykite jį, jei reikia, padaliję kodą.

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

Aprašykite vardų sritį, kurią norite naudoti.

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

Ši klasė naudojama žetonų informacijai gauti po autentifikavimo. Program.cs , parašykite jį kodo pabaigoje. Šią klasę galite atskirti į kitus failus.

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

Tai stebuklingas metodas, kuris formatuoja JSON tekstą, gautą iš API, su įtrauka. Kadangi tai yra kodas, paimtas iš interneto, turinio išsamiai nepaaiškinsiu.

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

Nustatykite kiekvieno iš jų ID, gautą "Azure". accessToken yra laikinas prieigos prie "OneDrive" atpažinimo ženklas, todėl jis nustatomas vykdymo metu.

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

API URL autentifikavimui ir API URL, kad gautumėte aplankų sąrašą "OneDvie" šaknyje. Tai aprašymas, kaip patikrinti prieigą prie "OneDrive" API, todėl neaprašysiu "OneDrive" API turinio. Jei turite prieigą prie "OneDrive" API, įkėlimas ir atsisiuntimas yra programa, todėl nemanau, kad tai taip sunku.

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

Sugeneravote užklausą HttpClient nurodytu 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}");

Pirmiausia pateiksite užklausą autentifikavimo API su duomenimis, todėl paruoškite tuos duomenis. Siunčiamų duomenų formatas yra užklausos parametro eilutė formatu "Name1=Value1&Name2=Value2...", todėl ji sukuriama žodyne ir konvertuojama į užklausos parametro eilutę.

Yra keturi parametrai, kuriuos reikia siųsti:

pavyzdys
Parametro pavadinimo reikšmių
client_id Nustatykite kliento ID, kurį gavote registruodami programą.
mastas Autentifikavimas naudojant kliento paslaptį yra fiksuotas https://graph.microsoft.com/.default .
client_secret Nustatykite kliento paslapties, kurią gavote registruodami programą, vertę.
grant_type Kadangi tai yra autentifikavimas su kliento paslaptimi, client_credentials tai bus

Norėdami gauti daugiau informacijos, apsilankykite šioje oficialioje svetainėje.

// 認証処理
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 , kad pateiktumėte užklausą autentifikavimo API. HttpClient Tai įprastas naudojimas, todėl nemanau, kad yra į ką atkreipti dėmesį.

Siunčiami duomenys turi būti užkoduoti UTF8, o turinio tipas turi būti application/x-www-form-urlencoded . Metodas yra POST .

IsSuccessStatusCode Jei atsakymas bus patikrintas ir sėkmingai apdorotas, rezultatą gausite kaip JSON eilutę. Gautas JSON turi šiuos parametrus:

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

access_token Čia mes naudosime . Naudokite šią reikšmę su "OneDrive" API. Galite nepaisyti kitų parametrų, betaccess_token jei norite sužinoti galiojimo datą , naudokite expires_in .

Sunku naudoti kaip JSON eilutę, todėl JsonSerializer.Deserialize mes ją deserializuojame ir tada access_token gauname .

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

Galiausiai naudokite prieigos atpažinimo ženklą, kad pateiktumėte užklausą "OneDrive" API. Metodas nurodo GET , bet tai priklauso nuo API tipo, todėl patikrinkite OneDrive API dokumentaciją.

Įtraukite prieigos atpažinimo ženklą į antraštę. Nustatykite raktą kaip Authorization ir reikšmę Bearer {アクセストークン} formatu .

Viskas, ką jums reikia padaryti, tai pateikti užklausą ir gauti rezultatą kaip JSON eilutę. Dabar, kai tik įsitikiname, kad turime prieigą prie "OneDrive" API, tiesiog suformatuojame JSON eilutę ir spausdiname ją konsolėje. Tiesą sakant, jis deserializuoja gautą JSON ir atitinkamai jį apdoroja.

Šį kartą gavau aplankų sąrašą, bet manau, kad JSON yra toks.

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

Nemanau, kad jums reikia visos informacijos, todėl, pavyzdžiui, jei norite gauti tik aplanko pavadinimą, value galite gauti tik parametrus iš name masyvo .

Suvestinė

Jei iki šiol jis veikia gerai, turėtumėte turėti galimybę pasiekti "OneDrive" naudodami paketinę programą. Nežinau, ar patarimai apibendrina įkėlimo ir atsisiuntimo metodus, bet iš esmės tai turėtų veikti, jei taikysite aplankų sąrašą aukščiau aprašytoje šaknyje. API tipai apibendrinti toliau pateiktoje oficialioje svetainėje, todėl suraskite API, kurią norite naudoti, ir ją įgyvendinkite.

ačiū

Šį kartą turėjau klausimų apie "OneDrive" API naudojimą, todėl uždaviau klausimą.