Izmantojiet OneDrive API bez lietotāja mijiedarbības, piemēram, pakešprogrammas (.NET C# versija) (bez papildu lietošanas bibliotēkām)

Lapa atjaunota :
Lapas izveides datums :

Darbības vide

Visual Studio
  • Visual Studio 2022
.NETO
  • .NET 8
Microsoft autentifikācijas API
  • 2.0 OAuth 2
Microsoft OneDrive API
  • 1.0
Microsoft kontu tipi
  • Darba vai mācību konts

Priekšnoteikumi

Visual Studio
  • Viena no versijām
.NETO
  • Viena no versijām
Microsoft autentifikācijas API
  • 2.0 OAuth 2
Microsoft OneDrive API
  • 1.0
Microsoft kontu tipi
  • Darba vai mācību konts

Par šī pasākuma mērķi

Tagad izmantosit OneDrive API, lai sagatavotos programmiskai failu augšupielādei un lejupielādei pakalpojumā OneDrive. Šajā rakstā mēs apskatīsim, ko varat darīt ar OneDrive API, tāpēc mēs neiedziļināsimies tajā, ko varat darīt ar OneDrive API. Tomēr, ja vien varat izveidot savienojumu, varat izlasīt API dokumentāciju un pēc tam to lietot.

Kā palaist programmu

Piekļuve pakalpojumam OneDrive nav atkarīga no programmas formas, piemēram, tīmekļa lietojumprogrammas, darbvirsmas lietojumprogrammas vai konsoles lietojumprogrammas, un to var palaist dažādas programmas. Šajā gadījumā mēs izveidosim konsoles lietojumprogrammu un izpildīsim to automātiski bez lietotāja darbības.

Kādi ir Microsoft kontu tipi?

Ja kādreiz esat izveidojis Microsoft kontu, iespējams, esat to redzējis. Ir divi galvenie Microsoft kontu tipi: personiskie Microsoft konti un darba vai mācību konti. OneDrive ir saistīts ar Microsoft kontu, taču OneDrive tips nedaudz atšķiras atkarībā no iepriekš norādītā konta tipa.

Pašlaik OneDrive API var izmantot ar abiem iepriekš minētajiem kontu tipiem. Šajā programmā kā "izveidots kā konsoles lietojumprogramma un izpildīts bez lietotāja darbības", Lūdzu, ņemiet vērā, ka to var izmantot tikai ar Microsoft kontu kontā "Darba vai mācību konts". Tas ir saistīts ar atšķirībām autentifikācijas metodēs.

Par autentifikācijas metodi

Pirmkārt, jums ir jāautentificējas, lai programmiski piekļūtu OneDrive. Kā minēts iepriekš, jebkura programma var piekļūt OneDrive, bet autentifikācija, lai izveidotu savienojumu ar API, ir atkarīga no tā, kā programma darbojas. Tīmekļa lietojumprogrammas un darbvirsmas lietojumprogrammas var autentificēt, mijiedarbojoties ar lietotāju. Tā kā lietotājs to nevar darbināt konsoles lietojumprogrammā, kas darbojas fonā, autentifikācijas metode atšķiras arī no iepriekš minētās.

Es nezinu detalizētu iemeslu, jo neesmu varējis to uzmeklēt, bet, ja tas nāk prātā, šķiet, ka tas ir saistīts ar drošību un konta pārvaldību. Es varu tikai teikt, ka šī jau ir specifikācija, tādēļ, ja vēlaties programmiski piekļūt OneDrive, kas saistīts ar "personisko Microsoft kontu", Es domāju, ka nav citas izvēles, kā izmantot programmu, kas nav programma, kas darbojas fonā, vai palaist konsoles lietojumprogrammu ar autentifikācijas metodi, kas ietver lietotāja darbības.

Pašlaik mēs neizmantosim bibliotēku, lai piekļūtu OneDrive API

Piekļuve OneDrive API ir salīdzinoši viegli lietojama, izmantojot bibliotēku ar nosaukumu "Microsoft Graph". Šajā gadījumā mēs izmantosim metodi, kā tieši piekļūt API URL un izpildīt to. Tas ir nedaudz apgrūtinoši, taču, tā kā tajā netiek izmantota bibliotēka, tā priekšrocība ir tā, ka non-.NET programmas var piekļūt OneDrive API tādā pašā veidā. Tas arī novērš trūkumus, ka kods mainās dažādu bibliotēkas versiju dēļ.

Mēs parādīsim, kā izmantot Microsoft Graph, citā padomā.

Priekšnosacījumu

  • Jums ir Microsoft konts darba vai mācību kontam
  • Varat izmantot OneDrive, kas saistīts ar iepriekš norādīto Microsoft kontu (piemēram, OneDrive Business)
  • Instalēta Visual Studio 2022

Lietojumprogrammas iestatīšana, lai piekļūtu savam Microsoft kontam vai pakalpojumam OneDrive pakalpojumā Azure

Piesakieties pakalpojumā Azure, izmantojot šo vietrādi URL:

Iepriekš redzamajā meklēšanas laukā ierakstiet "lietotņu reģistrācijas" un atlasiet to.

Noklikšķiniet uz Jauna reģistrācija.

"Nosaukuma" saturs ir patvaļīgs. Lūdzu, ievadiet aprakstošu nosaukumu.

Atlasiet "Atbalstītā konta tips", kas nav "Tikai personiskie Microsoft konti". Tas ir tāpēc, ka, kā minēts iepriekš, šo autentifikāciju var izmantot tikai ar kontiem, kas pieder organizācijai. Šajā gadījumā mēs esam atlasījuši "Konti jebkurā organizācijas direktorijā (jebkurš Microsoft Entra ID nomnieks - vairāku nomnieku) un personiskie Microsoft konti (Skype, Xbox utt.)".

Jums nav jāievada "Redirect URI", jo tas šoreiz netiks izmantots.

Kad esat pabeidzis, noklikšķiniet uz pogas "Reģistrēties".

Tiks atvērta jūsu izveidotās programmas reģistrācijas kopsavilkuma lapa, tāpēc nokopējiet lietojumprogrammas (klienta) ID un direktorija (nomnieka) ID. Šo vērtību izmantosit vēlāk.

Kreisās izvēlnes pārvaldības kategorijā atlasiet "Sertifikāti un noslēpumi" un pārliecinieties, vai vidējā cilnē ir atlasīts "Klienta noslēpumi". Noklikšķiniet uz Jauns klienta noslēpums.

Apraksta ievadīšana nav obligāta. Ja vēlaties turpināt to lietot, lūdzu, iekļaujiet paskaidrojumu, kurā skaidri izskaidrots lietošanas mērķis.

"Derīguma termiņš" ir laika periods, kurā šis klienta noslēpums ir derīgs. Tā kā šoreiz tas ir paredzēts testēšanai, tas ir 90 dienas, bet, lūdzu, iestatiet to atbilstoši lietošanas mērķim.

Kad izveidojat klienta noslēpumu, tas tiek pievienots sarakstam. Tajā mēs izmantosim vērtību slejā "Vērtība", tāpēc nokopējiet to. Ņemiet vērā, ka šo vērtību vēlāk nevar kopēt.

Pēc tam kreisajā izvēlnē administrācijas kategorijā atlasiet "API atļaujas" un vidū noklikšķiniet uz "Pievienot atļaujas".

API atļaujas pieprasījumā noklikšķiniet uz Microsoft Graph.

Noklikšķiniet uz Allow Application (Atļaut lietojumprogrammu). Šī opcija nav pieejama personiskajiem Microsoft kontiem.

Tālāk tiks parādīts atļauju saraksts, tāpēc izmantojiet meklēšanas lauku, lai pārbaudītu tālāk norādītos vienumus.

  • Files.ReadWrite.All

Tas ir pietiekami, ja vēlaties izmantot tikai OneDrive, bet, ja vēlaties piekļūt kaut kam citam, pievienojiet atļaujas. Atļaujas, kas nepieciešamas, lai piekļūtu OneDrive, var atrast zemāk esošajā oficiālajā lapā.

Kad esat veicis atlasi, noklikšķiniet uz pogas Pievienot atļaujas.

Pievienotais tiek pievienots sarakstam, un "Tips" ir "Lietojumprogramma". Tomēr, tā kā "Statuss" ir "Nav piešķirts XXXX", noklikšķiniet uz "Sniegt administratora piekrišanu XXXX". (XXXX ir jūsu organizācijas nosaukums)

Noklikšķiniet uz Jā.

Tā mainās uz piešķirto valsti.

Starp citu, jūs varat izdzēst "deleģēto User.Read", kas tur atrodas no sākuma, jo mēs to šoreiz neizmantosim. Ja pievienojāt "User.Read" kā lietojumprogrammu, izmantojiet to.

Lietotāju ID pārbaude

Tā kā jūs piekļūsit OneDrive, kas ir mērķa lietotājam, iepriekš pārbaudiet lietotāja ID.

Microsoft Entra ID un atveriet to.

Kreisās puses izvēlnē atlasiet Lietotāji.

Tiks parādīts lietotāju saraksts, tāpēc noklikšķiniet uz mērķa lietotāja.

Pierakstiet "Objekta ID", jo tas būs lietotāja ID.

Izveidojiet konsoles lietojumprogrammu

Startējiet Visual Studio un izveidojiet projektu konsoles lietojumprogrammai. To var izveidot ārpus Visual Studio, bet pagaidām izmantošu Visual Studio.

Atrašanās vieta un projekta nosaukums nav obligāti. Šajā gadījumā projekta nosaukums ir OneDriveApiDotNetClientCredentialsHttpClient .

Šoreiz mēs nesadalīsim kodu, bet Program.cs rakstīsim to pakāpeniski no augšas, tāpēc, ja jūs varat pārbaudīt kustību, lūdzu, pārrakstiet to, sadalot kodu pēc vajadzības.

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

Aprakstiet nosaukumvietu, kuru vēlaties izmantot.

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

Šī klase tiek izmantota, lai saņemtu marķiera informāciju pēc autentifikācijas. Program.cs , lūdzu, uzrakstiet to koda beigās. Šo klasi var sadalīt citos failos.

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

Šī ir maģiska metode, kas formatē JSON tekstu, kas saņemts no API ar atkāpi. Tā kā tas ir kods, kas paņemts no interneta, es detalizēti nepaskaidrošu saturu.

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

Katram iestatiet pakalpojumā Azure iegūto ID. accessToken ir pagaidu marķieris, lai piekļūtu pakalpojumam OneDrive, tāpēc tas ir iestatīts izpildlaikā.

// 各種 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 vietrādis URL autentifikācijai un API URL, lai iegūtu mapju sarakstu OneDvie saknē. Šis ir apraksts par to, kā pārbaudīt piekļuvi OneDrive API, tāpēc es neaprakstīšu OneDrive API saturu. Ja jums ir piekļuve OneDrive API, augšupielāde un lejupielāde ir lietojumprogramma, tāpēc es nedomāju, ka tas ir tik grūti.

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

Jūs esat ģenerējis a, lai iesniegtu pieprasījumu uz HttpClient norādīto 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}");

Vispirms jūs pieprasīsit autentifikācijas API ar datiem, tāpēc sagatavojiet šos datus. Nosūtāmo datu formāts ir vaicājuma parametru virkne formātā "Name1=Value1&Name2=Value2...", tāpēc tā tiek izveidota vārdnīcā un pēc tam pārvērsta vaicājuma parametru virknē.

Ir jānosūta četri parametri:

piemērs
Parametru nosaukumu vērtību
client_id Iestatiet klienta ID, ko ieguvāt programmas reģistrācijā.
Darbības joma Autentifikācija ar klienta noslēpumu ir fiksēta https://graph.microsoft.com/.default .
client_secret Iestatiet klienta noslēpuma vērtību, ko ieguvāt programmas reģistrācijā.
grant_type Tā kā tā ir autentifikācija ar klienta noslēpumu, client_credentials tā būs

Lai iegūtu papildinformāciju, lūdzu, skatiet šo oficiālo vietni.

// 認証処理
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 , lai iesniegtu autentifikācijas API pieprasījumu. HttpClient Tas ir izplatīts lietojums, tāpēc es nedomāju, ka ir daudz, kam pievērst uzmanību.

Nosūtāmajiem datiem jābūt kodētiem UTF8 un satura tipam jābūt application/x-www-form-urlencoded . Metode ir POST .

IsSuccessStatusCode Ja atbilde tiek pārbaudīta un apstrādāta veiksmīgi, jūs saņemsiet rezultātu kā JSON virkni. Saņemtajam JSON ir šādi parametri:

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

Šajā gadījumā access_token mēs izmantosim . Izmantojiet šo vērtību ar OneDrive API. Varat ignorēt citus parametrus, betaccess_token , ja vēlaties uzzināt derīguma termiņu , izmantojiet expires_in .

To ir grūti izmantot kā JSON virkni, tāpēc JsonSerializer.Deserialize mēs to deserializējam ar un pēc tam access_token iegūstam .

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

Visbeidzot, izmantojiet piekļuves pilnvaru, lai iesniegtu pieprasījumu OneDrive API. Metode norāda GET , bet tas ir atkarīgs no API veida, tāpēc skatiet OneDrive API dokumentāciju.

Pievienojiet galvenei piekļuves pilnvaru. Iestatiet atslēgu kā Authorization un vērtību Bearer {アクセストークン} formātā .

Viss, kas jums jādara, ir jāiesniedz pieprasījums un jāsaņem rezultāts kā JSON virkne. Tagad, kad mēs tikai pārliecināmies, ka mums ir piekļuve OneDrive API, mēs vienkārši formatējam JSON virkni un drukājam to konsolē. Faktiski tas deserializē saņemto JSON un attiecīgi to apstrādā.

Šoreiz esmu saņēmis mapju sarakstu, bet domāju, ka JSON ir šāds.

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

Es nedomāju, ka jums ir nepieciešama visa informācija, tādēļ, ja vēlaties iegūt tikai mapes nosaukumu, piemēram, varat value iegūt tikai parametrus no name masīva .

Kopsavilkuma

Ja līdz šim tas darbojas labi, jums vajadzētu būt iespējai piekļūt OneDrive, izmantojot pakešprogrammu. Es nezinu, vai padomi apkopo augšupielādes un lejupielādes metodes, bet būtībā tam vajadzētu darboties, ja lietojat mapju sarakstu iepriekš aprakstītajā saknē. API veidi ir apkopoti zemāk esošajā oficiālajā tīmekļa vietnē, tāpēc, lūdzu, atrodiet API, kuru vēlaties izmantot, un ieviesiet to.

paldies

Man šoreiz bija daži jautājumi par OneDrive API lietošanu, tāpēc es uzdevu jautājumu.