שימוש ב- API של OneDrive ללא אינטראקציה עם המשתמש, כגון תוכנית אצווה (גירסת .NET C# ) (אין שימוש נוסף בספריות)
סביבת הפעלה
- Visual Studio
-
- Visual Studio 2022
- .רשת
-
- .NET 8
- API של אימות Microsoft
-
- 2.0 OAuth 2
- Microsoft OneDrive API
-
- 1.0
- סוגי חשבונות Microsoft
-
- חשבון בעבודה או בבית ספר
דרישות מוקדמות
- Visual Studio
-
- אחת הגרסאות
- .רשת
-
- אחת הגרסאות
- API של אימות Microsoft
-
- 2.0 OAuth 2
- Microsoft OneDrive API
-
- 1.0
- סוגי חשבונות Microsoft
-
- חשבון בעבודה או בבית ספר
על מטרת האירוע
כעת תשתמש בממשקי ה- API של OneDrive כדי להכין אותך להעלאה והורדה של קבצים ל- OneDrive באופן תיכנותי. במאמר זה, נפרט מה ניתן לעשות עם ה- API של OneDrive, כך שלא ניכנס למה שניתן לעשות עם ה- API של OneDrive. עם זאת, כל עוד אתה יכול להתחבר, אתה יכול לקרוא את תיעוד ה- API ולהחיל אותו לאחר מכן.
כיצד להפעיל את התוכנית
הגישה ל- OneDrive אינה תלויה בצורת התוכנית, כגון יישום אינטרנט, יישום שולחן עבודה או יישום מסוף, וניתן להפעיל אותה על-ידי מגוון תוכניות. במקרה זה, ניצור יישום מסוף ונבצע אותו באופן אוטומטי ללא כל פעולת משתמש.
מהם הסוגים השונים של חשבונות Microsoft?
אם אי פעם יצרת חשבון Microsoft, סביר להניח שראית אותו. קיימים שני סוגים עיקריים של חשבונות Microsoft: חשבונות Microsoft אישיים וחשבונות בעבודה או בבית ספר. OneDrive קשור לחשבון Microsoft, אך סוג OneDrive משתנה מעט בהתאם לסוג החשבון המפורט לעיל.
לעת עתה, ניתן להשתמש ב- API של OneDrive עם שני סוגי החשבונות לעיל. בתוכנית זו בצורה של "נוצר כיישום מסוף ומבוצע ללא פעולת המשתמש", שים לב שניתן להשתמש בו רק עם חשבון Microsoft בחשבון "חשבון בעבודה או בבית ספר". זאת בשל הבדלים בשיטות האימות.
אודות שיטת האימות
תחילה, עליך לבצע אימות כדי לגשת ל- OneDrive באופן תיכנותי. כפי שצוין לעיל, כל תוכנית יכולה לגשת OneDrive, אך האימות כדי להתחבר ל- API תלוי באופן שבו התוכנית פועלת. ניתן לאמת יישומי אינטרנט ויישומי שולחן עבודה באמצעות אינטראקציה עם המשתמש. מכיוון שהמשתמש אינו יכול להפעיל אותו ביישום מסוף הפועל ברקע, שיטת האימות שונה גם מהאמור לעיל.
אני לא יודע את הסיבה המפורטת כי לא הצלחתי לחפש את זה, אבל אם זה עולה על הדעת, נראה שזה בגלל אבטחה וניהול חשבונות. אני יכול רק לומר שזה כבר מפרט, אז אם אתה רוצה לגשת באופן תוכניתי OneDrive המשויך "חשבון Microsoft אישי", אני חושב שאין ברירה אלא להשתמש בתוכנית שאינה תוכנית שרצה ברקע, או להריץ יישום מסוף עם שיטת אימות הכוללת פעולות משתמש.
לא נשתמש בספריה כדי לגשת ל- API של OneDrive בשלב זה
הגישה ל- API של OneDrive קלה יחסית לטיפול באמצעות ספריה בשם "Microsoft Graph". במקרה זה, נשתמש בשיטה של גישה ישירה לכתובת האתר של ה- API וביצועה. זה קצת מסורבל, אבל מכיוון שהוא לא משתמש בספריה, יש לו את היתרון שתוכניות non-.NET יכולות לגשת ל- API של OneDrive באותו אופן. הוא גם מונע את החיסרון שהקוד משתנה עקב גירסאות שונות של הספריה.
נראה לך כיצד להשתמש ב- Microsoft Graph בעצה נוספת.
תנאי מקדים
- יש לך חשבון Microsoft עבור חשבון בעבודה או בבית ספר
- באפשרותך להשתמש ב- OneDrive המשויך לחשבון Microsoft המפורט לעיל (לדוגמה, OneDrive Business)
- Visual Studio 2022 מותקן
הגדרת היישום שלך כך שייגש לחשבון Microsoft או ל- OneDrive שלך ב- Azure
היכנס ל- Azure בכתובת ה- URL הבאה:
משדה החיפוש למעלה, הקלד "רישומי אפליקציות" ובחר אותו.
לחץ על רישום חדש.
התוכן של "שם" הוא שרירותי. הזן שם תיאורי.
בחר "סוג חשבון נתמך" שאינו "חשבונות Microsoft אישיים בלבד". הסיבה לכך היא, כפי שצוין לעיל, אימות זה יכול לשמש רק עם חשבונות השייכים לארגון. במקרה זה, בחרנו באפשרות "חשבונות בכל ספריה ארגונית (כל דייר Microsoft Entra ID - מרובה דיירים) וחשבונות Microsoft אישיים (Skype, Xbox וכו')".
אינך צריך להזין את "ניתוב מחדש URI" מכיוון שהוא לא ישמש הפעם.
כשתסיים, לחץ על הלחצן "הרשמה".
תועבר לדף הסיכום של רישום האפליקציה שיצרת, לכן העתק את מזהה היישום (לקוח) ואת מזהה הספריה (דייר). תשתמש בערך זה מאוחר יותר.
בחר "אישורים וסודות" מקטגוריית הניהול בתפריט השמאלי וודא שהאפשרות "סודות לקוח" נבחרה בכרטיסייה האמצעית. לחץ על סוד לקוח חדש.
הזנת תיאור היא אופציונלית. אם ברצונך להמשיך להשתמש בו, כלול הסבר המסביר בבירור את מטרת השימוש.
"תאריך התפוגה" הוא פרק הזמן שבו סוד לקוח זה תקף. מכיוון שזה למטרות בדיקה הפעם, זה 90 יום, אבל בבקשה להגדיר את זה בהתאם למטרת השימוש.
בעת יצירת סוד לקוח, הוא נוסף לרשימה. בכך, נשתמש בערך בעמודה "ערך", אז העתק אותו. שים לב שלא ניתן להעתיק ערך זה מאוחר יותר.
לאחר מכן, בחר "הרשאות API" מקטגוריית הניהול בתפריט השמאלי ולחץ על "הוסף הרשאות" באמצע.
בבקשת ההרשאה API, לחץ על Microsoft Graph.
לחץ על אפשר יישום. אפשרות זו אינה זמינה עבור חשבונות Microsoft אישיים.
רשימת הרשאות תוצג להלן, לכן השתמש בשדה החיפוש כדי לבדוק את הפריטים הבאים.
- Files.ReadWrite.All
זה מספיק אם ברצונך להשתמש רק ב- OneDrive, אך אם ברצונך לגשת לכל דבר אחר, הוסף הרשאות. ניתן למצוא את ההרשאות הדרושות כדי לגשת ל- OneDrive בדף הרשמי למטה.
לאחר שביצעת את הבחירות שלך, לחץ על לחצן הוסף הרשאות.
אחד נוסף מתווסף לרשימה, ואת "סוג" הוא "יישום". עם זאת, מכיוון ש"סטטוס" הוא "לא הוענק ל- XXXX", לחץ על "תן הסכמת מנהל מערכת ל- XXXX". (XXXX הוא שם הארגון שלך)
לחץ על כן.
זה משתנה למצב הנתון.
אגב, אתה יכול למחוק את "User.Read מוסמך" כי הוא שם מההתחלה כי אנחנו לא נשתמש בו הפעם. אם הוספת את "User.Read" כיישום, השתמש בו.
אימות מזהי משתמשים
מכיוון שתיגש ל- OneDrive שיש למשתמש היעד, בדוק את מזהה המשתמש מראש.
Microsoft Entra ID
ולפתוח אותו.
בחר משתמשים מהתפריט משמאל.
תוצג רשימת משתמשים, לכן לחץ על משתמש היעד.
רשום לעצמך את "מזהה אובייקט" כפי שהוא יהיה מזהה המשתמש.
יצירת יישום מסוף
הפעל את Visual Studio וצור פרוייקט עבור יישום הקונסולה שלך. באפשרותך ליצור אותו מחוץ ל- Visual Studio, אך אשתמש ב- Visual Studio לעת עתה.
המיקום ושם הפרויקט הם אופציונליים. במקרה זה, שם הפרויקט הוא OneDriveApiDotNetClientCredentialsHttpClient
.
הפעם, לא נחלק את הקוד, אלא Program.cs
נכתוב אותו מדורג מלמעלה, כך שאם אתה יכול לבדוק את התנועה, אנא כתוב אותה מחדש על ידי חלוקת הקוד לפי הצורך.
using System.Runtime.Serialization.Json;
using System.Text;
using System.Text.Json;
using System.Web;
using System.Xml;
תאר את מרחב השמות שבו ברצונך להשתמש.
// 認証結果を格納するクラスです
public record TokenResponse(string token_type, int expires_in, int ext_expires_in, string access_token);
מחלקה זו משמשת לקבלת פרטי אסימון לאחר האימות.
Program.cs
אנא כתוב זאת בסוף הקוד.,
באפשרותך להפריד מחלקה זו לקבצים אחרים.
// 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());
}
זוהי שיטה קסומה המעצבת טקסט JSON שהתקבל מה- API עם כניסה. מכיוון שמדובר בקוד שנאסף מהאינטרנט, לא אסביר את התוכן בפירוט.
// 各種 ID などの定義
var clientId = "XXXXXXXX"; // クライアント ID
var tenantId = "XXXXXXXX"; // テナント ID
var clientSecret = "XXXXXXXX"; // クライアント シークレット
var userId = "XXXXXXXX"; // ユーザー ID
var accessToken = ""; // アクセストークン
הגדר את המזהה שהתקבל ב- Azure עבור כל אחד מהם.
accessToken
הוא אסימון זמני לגישה ל- OneDrive, ולכן הוא מוגדר בזמן ריצה.
// 各種 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 עבור אימות וכתובת ה- URL של ה- API כדי לקבל את רשימת התיקיות בבסיס של OneDvie. זהו תיאור של אופן בדיקת הגישה ל- API של OneDrive, ולכן לא אתאר את התוכן של ה- API של OneDrive. אם יש לך גישה ל- API של OneDrive, העלאה והורדה הן יישום, כך שאיני חושב שזה כל כך קשה.
// 使いまわすので最初に定義しておく
HttpClient httpClient = new();
יצרת כדי להגיש בקשה לכתובת HttpClient
ה- 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}");
תחילה, תגיש בקשה ל- API של האימות עם נתונים, לכן הכן נתונים אלה. תבנית הנתונים שיש לשלוח היא מחרוזת פרמטר שאילתה בתבנית "Name1=Value1&Name2=Value2...", כך שהיא נוצרת במילון ולאחר מכן מומרת למחרוזת פרמטר שאילתה.
ישנם ארבעה פרמטרים שיש לשלוח:
ערכי לדוגמהשם פרמטר | |
---|---|
client_id | הגדר את מזהה הלקוח שקיבלת ברישום האפליקציה. |
היקף | אימות עם סוד לקוח קבוע https://graph.microsoft.com/.default . |
client_secret | הגדר את הערך של סוד הלקוח שקיבלת ברישום האפליקציה. |
grant_type | מכיוון שמדובר באימות עם סוד לקוח, client_credentials זה יהיה |
לקבלת מידע נוסף, עיין באתר הרשמי הבא.
// 認証処理
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
כדי להגיש בקשה ל- API של האימות. HttpClient
זה שימוש נפוץ, אז אני לא חושב שיש הרבה לשים לב.
הנתונים שיש לשלוח חייבים להיות מקודדים ב- UTF8 וסוג התוכן צריך להיות application/x-www-form-urlencoded
. השיטה היא POST
.
אם התגובה נבדקת IsSuccessStatusCode
ומעובדת בהצלחה, תקבל את התוצאה כמחרוזת JSON.
ה- JSON שאתה מקבל כולל את הפרמטרים הבאים:
{
"token_type": "Bearer",
"expires_in": 3599,
"ext_expires_in": 3599,
"access_token": "XXXXXXXXXXXXXXX"
}
בזה, access_token
נשתמש . השתמש בערך זה עם ה- API של OneDrive.
באפשרותך להתעלם מהפרמטרים האחרים, אךaccess_token
אם ברצונך לדעת את תאריך התפוגה של , השתמש expires_in
ב- .
קשה להשתמש בו כמחרוזת JSON, אז JsonSerializer.Deserialize
אנחנו מבטלים אותו בסידרה עם ואז access_token
מקבלים .
// 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)}");
}
לבסוף, השתמש באסימון הגישה כדי להגיש בקשה ל- API של OneDrive.
השיטה מציינת GET
, אך היא תלויה בסוג ה- API, לכן עיין בתיעוד ה- API של OneDrive.
הוסף את אסימון הגישה לכותרת. הגדר את המפתח כ Authorization
- ואת הערך בתבנית Bearer {アクセストークン}
.
כל שעליך לעשות הוא להגיש בקשה ולקבל את התוצאה כמחרוזת JSON. כעת, כשאנחנו רק מוודאים שיש לנו גישה ל- API של OneDrive, אנחנו פשוט מאתחלים את מחרוזת JSON ומדפיסים אותה בקונסולה. למעשה, הוא מבטל את ה-JSON שהתקבל ומעבד אותו בהתאם.
קיבלתי רשימה של תיקיות הפעם, אבל אני חושב JSON הוא כדלקמן.
{
"@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": "フォルダ名"
}
},
:
]
}
אני לא חושב שאתה צריך את כל המידע, אז אם אתה רוצה לקבל רק את שם התיקייה, למשל, אתה value
יכול לקבל רק את הפרמטרים מהמערך name
ב .
תקציר
אם זה עובד בסדר עד כה, אתה אמור להיות מסוגל לגשת OneDrive עם תוכנית אצווה. אני לא יודע אם הטיפים מסכמים את שיטות ההעלאה וההורדה, אבל בעצם זה אמור לעבוד אם אתה מחיל את רשימת התיקיות בשורש שתואר לעיל. סוגי ממשקי ה- API מסוכמים באתר הרשמי למטה, אז אנא מצא את ה- API שבו ברצונך להשתמש וליישם אותו.
תודה
היו לי כמה שאלות לגבי השימוש ב- API של OneDrive הפעם, אז שאלתי שאלה.