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)
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.