A OneDrive API használata felhasználói beavatkozás, például kötegprogram (.NET C#-verzió) nélkül (további használati kódtárak nélkül)

Oldal frissítve :
Oldal létrehozásának dátuma :

Működési környezet

Visual Studio
  • Visual Studio 2022
.HÁLÓ
  • .NET 8
Microsoft hitelesítési API
  • 2.0 OAuth 2
Microsoft OneDrive API
  • 1.0
A Microsoft-fiókok típusai
  • Munkahelyi vagy iskolai fiók

Előfeltételek

Visual Studio
  • Az egyik változat
.HÁLÓ
  • Az egyik változat
Microsoft hitelesítési API
  • 2.0 OAuth 2
Microsoft OneDrive API
  • 1.0
A Microsoft-fiókok típusai
  • Munkahelyi vagy iskolai fiók

Az esemény céljáról

Most már a OneDrive API-k használatával felkészülhet a fájlok programozott feltöltésére és letöltésére a OneDrive-ra. Ebben a cikkben bemutatjuk, hogy mire használhatja a OneDrive API-t, ezért nem megyünk bele abba, hogy mire használhatja a OneDrive API-t. Amíg azonban csatlakozni tud, elolvashatja az API dokumentációját, és ezt követően alkalmazhatja azt.

A program futtatása

A OneDrive-hoz való hozzáférés nem függ a program formájától, például webalkalmazástól, asztali alkalmazástól vagy konzolalkalmazástól, és számos program futtathatja. Ebben az esetben létrehozunk egy konzolalkalmazást, és automatikusan, felhasználói művelet nélkül végrehajtjuk.

Melyek a Microsoft-fiókok különböző típusai?

Ha már létrehozott Microsoft-fiókot, valószínűleg látta. A Microsoft-fiókoknak két fő típusa van: személyes Microsoft-fiókok és munkahelyi vagy iskolai fiókok. A OneDrive egy Microsoft-fiókhoz van kötve, de a OneDrive típusa a fent felsorolt fióktípustól függően kissé eltér.

A OneDrive API egyelőre mindkét fenti fióktípussal használható. Ebben a programban "konzolalkalmazásként létrehozva és felhasználói művelet nélkül végrehajtva", Vegye figyelembe, hogy csak a "munkahelyi vagy iskolai fiók" Microsoft-fiókkal használható. Ennek oka a hitelesítési módszerek különbségei.

A hitelesítési módszer

Először hitelesítenie kell magát a OneDrive programozott eléréséhez. Ahogy fentebb említettük, bármely program hozzáférhet a OneDrive-hoz, de az API-hoz való csatlakozáshoz szükséges hitelesítés a program futásától függ. A webalkalmazások és asztali alkalmazások felhasználói beavatkozással hitelesíthetők. Mivel a felhasználó nem tudja működtetni a háttérben futó konzolalkalmazásban, a hitelesítési módszer is eltér a fentiektől.

Nem tudom a részletes okot, mert nem tudtam utánanézni, de ha eszembe jut, úgy tűnik, hogy a biztonság és a fiókkezelés miatt. Csak azt mondhatom, hogy ez már specifikáció, tehát ha programozott módon szeretne hozzáférni a "személyes Microsoft-fiókhoz" társított OneDrive-hoz, Úgy gondolom, hogy nincs más választás, mint egy olyan program használata, amely nem a háttérben fut, vagy egy konzolalkalmazás futtatása olyan hitelesítési módszerrel, amely magában foglalja a felhasználói műveleteket.

Jelenleg nem fogjuk használni a tárat a OneDrive API eléréséhez

A OneDrive API-hoz való hozzáférés viszonylag könnyen kezelhető a "Microsoft Graph" nevű kódtár használatával. Ebben az esetben az API URL-jének közvetlen elérésére és végrehajtására szolgáló módszert fogjuk használni. Ez egy kicsit nehézkes, de mivel nem használ könyvtárat, előnye, hogy non-.NET program ugyanúgy hozzáférhet a OneDrive API-hoz. Megakadályozza azt a hátrányt is, hogy a kód a könyvtár különböző verziói miatt változik.

Egy másik tippben megmutatjuk, hogyan használhatja a Microsoft Graph.

előfeltétel

  • Munkahelyi vagy iskolai fiókhoz Microsoft-fiókkal rendelkezik
  • Használhatja a fent felsorolt Microsoft-fiókhoz társított OneDrive-ot (pl. OneDrive Business)
  • Visual Studio 2022 telepítve

Az alkalmazás beállítása a Microsoft-fiók vagy a OneDrive Azure-beli elérésére

Jelentkezzen be az Azure-ba a következő URL-címen:

A fenti keresőmezőbe írja be az "alkalmazásregisztrációk" kifejezést, és válassza ki.

Kattintson az Új regisztráció gombra.

A "Név" tartalma önkényes. Kérjük, adjon meg egy leíró nevet.

Válassza ki a "Csak személyes Microsoft-fiókok" beállítástól eltérő "Támogatott fióktípus" lehetőséget. Ennek az az oka, hogy a fent említettek szerint ez a hitelesítés csak egy szervezethez tartozó fiókokkal használható. Ebben az esetben a "Bármely szervezeti címtárban található fiókok (bármely Microsoft Entra ID bérlő – több-bérlős) és a személyes Microsoft-fiókok (Skype, Xbox stb.) lehetőséget választottuk".

Nem kell megadnia az "Átirányítási URI"-t, mert ezúttal nem lesz használva.

Ha végzett, kattintson a "Regisztráció" gombra.

A létrehozott alkalmazásregisztráció összefoglaló oldalára kerül, ezért másolja ki az alkalmazás (ügyfél) azonosítóját és a címtár (bérlő) azonosítóját. Ezt az értéket később fogja használni.

Válassza a "Tanúsítványok titkos kulcsok" lehetőséget a bal oldali menü felügyeleti kategóriájából, és győződjön meg arról, hogy a középső lapon az "Ügyfél titkos kulcsai" van kiválasztva. Kattintson az Új titkos ügyfélkulcs elemre.

A Leírás megadása nem kötelező. Ha továbbra is használni szeretné, kérjük, adjon meg egy magyarázatot, amely egyértelműen elmagyarázza a használat célját.

A "lejárati dátum" az az időtartam, ameddig ez az ügyfél titkos ügyfél titka érvényes. Mivel ezúttal tesztelési célokra szolgál, ez 90 nap, de kérjük, állítsa be a felhasználás céljának megfelelően.

Amikor létrehoz egy titkos ügyféltitkot, az hozzáadódik a listához. Ebben az "Érték" oszlopban lévő értéket fogjuk használni, ezért másoljuk ki. Vegye figyelembe, hogy ez az érték később nem másolható.

Ezután válassza az "API-engedélyek" lehetőséget a bal oldali menü Adminisztráció kategóriájából, majd kattintson a közepén található "Engedélyek hozzáadása" gombra.

Az API-engedélykérelemben kattintson a Microsoft Graph elemre.

Kattintson az Alkalmazás engedélyezése gombra. Ez a lehetőség személyes Microsoft-fiókok esetén nem érhető el.

Az engedélyek listája alább jelenik meg, ezért a keresőmező segítségével ellenőrizze a következő elemeket.

  • Fájlok.ReadWrite.All

Ez elég, ha csak a OneDrive-ot szeretné használni, de ha bármi mást szeretne elérni, adjon hozzá engedélyeket. A OneDrive eléréséhez szükséges engedélyek az alábbi hivatalos oldalon találhatók.

Miután kiválasztotta a beállításokat, kattintson az Engedélyek hozzáadása gombra.

A hozzáadott hozzáadódik a listához, és a "Típus" az "Alkalmazás". Mivel azonban az "Állapot" "Nem adható meg XXXX-nek", kattintson a "Rendszergazdai jóváhagyás megadása XXXX-hez" gombra. (XXXX a szervezet neve)

Kattintson az Igen gombra.

A megadott állapotra változik.

Egyébként törölheti a "delegált User.Read" -t, amely az elejétől ott van, mert ezúttal nem fogjuk használni. Ha alkalmazásként hozzáadta a "User.Read" fájlt, használja azt.

Felhasználói azonosítók ellenőrzése

Mivel a célfelhasználó OneDrive-ját fogja elérni, előzetesen ellenőrizze a felhasználói azonosítót.

Microsoft Entra ID és nyissa ki.

Válassza a Felhasználók lehetőséget a bal oldali menüből.

Megjelenik a felhasználók listája, ezért kattintson a célfelhasználóra.

Jegyezze fel az "Objektumazonosítót", mivel ez lesz a felhasználói azonosító.

Konzolalkalmazás létrehozása

Indítsa el a Visual Studiót, és hozzon létre egy projektet a konzolalkalmazáshoz. A Visual Studión kívül is létrehozhatja, de most a Visual Studiót fogom használni.

A hely és a projekt neve nem kötelező. Ebben az esetben a projekt neve OneDriveApiDotNetClientCredentialsHttpClient .

Ezúttal nem osztjuk fel a kódot, hanem Program.cs felülről lépcsőzetesen írjuk, ezért ha ellenőrizni tudja a mozgást, kérjük, írja át a kód szükség szerinti felosztásával.

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

Írja le a használni kívánt névteret.

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

Ez az osztály a jogkivonat-információk hitelesítés utáni fogadására szolgál. Program.cs , kérjük, írja be a kód végére. Ezt az osztályt más fájlokra is szétválaszthatja.

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

Ez egy varázslatos módszer, amely behúzással formázza az API-tól kapott JSON-szöveget. Mivel ez egy internetről felvett kód, nem fogom részletesen elmagyarázni a tartalmát.

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

Állítsa be az Azure-ban beszerzett azonosítót mindegyikhez. accessToken egy ideiglenes jogkivonat a OneDrive eléréséhez, ezért futásidőben van beállítva.

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

A hitelesítés API URL-címe és az API URL-címe a OneDvie gyökerében található mappák listájának lekéréséhez. Ez a OneDrive API-hoz való hozzáférés ellenőrzésének leírása, ezért nem fogom leírni a OneDrive API tartalmát. Ha hozzáfér a OneDrive API-hoz, a feltöltés és a letöltés egy alkalmazás, így nem hiszem, hogy olyan nehéz.

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

Létrehozott egy kérést, amely a megadott URL-címre vonatkozik 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}");

Először kérést fog küldeni a hitelesítési API-nak adatokkal, ezért készítse elő ezeket az adatokat. Az elküldendő adatok formátuma egy lekérdezési paraméter karakterlánc "Név1=Érték1&Név2=Érték2..." formátumban, tehát szótárban jön létre, majd lekérdezésparaméter-karakterlánccá konvertálódik.

Négy paramétert kell elküldeni:

Példa paraméternév-értékekre
client_id Állítsa be az alkalmazásregisztrációban beszerzett ügyfél-azonosítót.
kiterjedés Az ügyfél titkos kulcsával való hitelesítés javítva https://graph.microsoft.com/.default van.
client_secret Állítsa be az alkalmazásregisztrációban beszerzett titkos ügyfélkulcs értékét.
grant_type Mivel ez egy titkos ügyfélkulccsal történő hitelesítés, client_credentials az lesz

További információkért kérjük, látogasson el a következő hivatalos weboldalra.

// 認証処理
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 gombra a hitelesítési API-hoz intézett kéréshez. HttpClient Ez egy általános használat, ezért nem hiszem, hogy sok mindenre kell figyelni.

Az elküldendő adatoknak UTF8 kódolásúnak, a tartalomtípusnak application/x-www-form-urlencoded pedig . A módszer POST .

Ha a IsSuccessStatusCode válasz ellenőrzése és feldolgozása sikeres, az eredményt JSON-sztringként kapja meg. A kapott JSON a következő paraméterekkel rendelkezik:

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

Ebben access_token a következőt fogjuk használni: . Használja ezt az értéket a OneDrive API-val. A többi paramétert figyelmen kívül hagyhatja, deaccess_token ha tudni szeretné a lejárati dátumát, használja a expires_in parancsot.

Nehéz JSON-sztringként használni, ezért JsonSerializer.Deserialize deszerializáljuk a használatával, majd access_token a .

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

Végül a hozzáférési jogkivonattal küldjön kérést a OneDrive API-nak. A metódus megadja GET a értéket, de ez az API típusától függ, ezért tekintse meg a OneDrive API dokumentációját.

Adja hozzá a hozzáférési jogkivonatot a fejléchez. Állítsa be a kulcsot Authorization és az értéket a Bearer {アクセストークン} formátumban.

Mindössze annyit kell tennie, hogy kérést küld, és JSON-sztringként megkapja az eredményt. Most, hogy csak arról győződünk meg, hogy hozzáférünk a OneDrive API-hoz, csak formázzuk a JSON-sztringet, és kinyomtatjuk a konzolra. Valójában deszerializálja a fogadott JSON-t, és ennek megfelelően dolgozza fel.

Ezúttal megkaptam a mappák listáját, de azt hiszem, a JSON a következő.

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

Nem hiszem, hogy szüksége van az összes információra, így ha például csak a mappa nevét szeretné megkapni, value akkor csak a paramétereket kaphatja meg a tömbből name .

Összefoglalás

Ha eddig jól működik, akkor kötegelt programmal érheti el a OneDrive-ot. Nem tudom, hogy a tippek összefoglalják-e a feltöltés és letöltés módszereit, de alapvetően működnie kell, ha a fent leírt gyökérben lévő mappák listáját alkalmazza. Az API-k típusait az alábbi hivatalos weboldalon foglaljuk össze, ezért kérjük, keresse meg a használni kívánt API-t, és valósítsa meg.

kösz

Ezúttal volt néhány kérdésem a OneDrive API használatával kapcsolatban, ezért feltettem egy kérdést.