Korzystanie z interfejsu API usługi OneDrive bez interakcji z użytkownikiem, takiego jak program wsadowy (wersja .NET C#) (bez dodatkowych bibliotek użycia)
Środowisko pracy
- Visual Studio
-
- informacji o wersji Visual Studio 2022
- .SIEĆ
-
- .NET 8
- Interfejs API uwierzytelniania firmy Microsoft
-
- 2.0 Uwierzytelnianie OAuth 2
- Microsoft OneDrive API
-
- 1.0
- Typy kont Microsoft
-
- Konto służbowe
Warunki wstępne
- Visual Studio
-
- Jedna z wersji
- .SIEĆ
-
- Jedna z wersji
- Interfejs API uwierzytelniania firmy Microsoft
-
- 2.0 Uwierzytelnianie OAuth 2
- Microsoft OneDrive API
-
- 1.0
- Typy kont Microsoft
-
- Konto służbowe
O celu tego wydarzenia
Teraz będziesz korzystać z interfejsów API usługi OneDrive, aby przygotować się do programowego przekazywania i pobierania plików do usługi OneDrive. W tym artykule omówimy, co można zrobić za pomocą interfejsu API usługi OneDrive, więc nie będziemy zagłębiać się w to, co można zrobić za pomocą interfejsu API usługi OneDrive. Jednak tak długo, jak możesz się połączyć, możesz przeczytać dokumentację API i zastosować ją po tym.
Jak uruchomić program
Dostęp do usługi OneDrive nie jest zależny od formy programu, takiej jak aplikacja internetowa, aplikacja klasyczna lub aplikacja konsolowa, i może być uruchamiany przez różne programy. W takim przypadku utworzymy aplikację konsolową i uruchomimy ją automatycznie, bez żadnej operacji użytkownika.
Jakie są różne typy kont Microsoft?
Jeśli kiedykolwiek utworzyłeś konto Microsoft, prawdopodobnie je widziałeś. Istnieją dwa główne typy kont Microsoft: osobiste konta Microsoft i konta służbowe. Usługa OneDrive jest powiązana z kontem Microsoft, ale typ usługi OneDrive różni się nieznacznie w zależności od typu konta wymienionego powyżej.
Na razie interfejs API OneDrive może być używany z oboma powyższymi typami kont. W tym programie w postaci "tworzonej jako aplikacja konsolowa i wykonywanej bez działania przez użytkownika", Pamiętaj, że można go używać tylko z kontem Microsoft na koncie "Konto służbowe". Wynika to z różnic w metodach uwierzytelniania.
Informacje o metodzie uwierzytelniania
Najpierw musisz się uwierzytelnić, aby programowo uzyskać dostęp do usługi OneDrive. Jak wspomniano powyżej, każdy program może uzyskać dostęp do usługi OneDrive, ale uwierzytelnianie w celu nawiązania połączenia z interfejsem API zależy od sposobu działania programu. Aplikacje internetowe i aplikacje komputerowe mogą być uwierzytelniane przez interakcję z użytkownikiem. Ponieważ użytkownik nie może go obsługiwać w aplikacji konsolowej, która działa w tle, metoda uwierzytelniania również różni się od powyższej.
Nie znam szczegółowego powodu, ponieważ nie byłem w stanie tego sprawdzić, ale jeśli przychodzi mi to na myśl, wydaje się, że jest to spowodowane bezpieczeństwem i zarządzaniem kontem. Mogę tylko powiedzieć, że jest to już specyfikacja, więc jeśli chcesz programowo uzyskać dostęp do OneDrive powiązanego z "osobistym kontem Microsoft", Myślę, że nie ma innego wyjścia, jak tylko użyć programu innego niż program, który działa w tle, lub uruchomić aplikację konsolową z metodą uwierzytelniania, która obejmuje operacje użytkownika.
W tej chwili nie będziemy używać biblioteki do uzyskiwania dostępu do interfejsu API usługi OneDrive
Dostęp do interfejsu API OneDrive jest stosunkowo łatwy w obsłudze przy użyciu biblioteki o nazwie "Microsoft Graph". W takim przypadku użyjemy metody bezpośredniego dostępu do adresu URL API i jego wykonania. Jest to nieco uciążliwe, ale ponieważ nie korzysta z biblioteki, ma tę zaletę, że non-.NET programy mogą uzyskiwać dostęp do interfejsu API OneDrive w ten sam sposób. Zapobiega to również niekorzystnej sytuacji, w której kod zmienia się z powodu różnych wersji biblioteki.
Pokażemy Ci, jak korzystać z programu Microsoft Graph w innej wskazówce.
Warunek wstępny
- Masz konto Microsoft dla konta służbowego
- Możesz użyć usługi OneDrive skojarzonej z kontem Microsoft wymienionym powyżej (np. OneDrive Business)
- Zainstalowany program Visual Studio 2022
Konfigurowanie aplikacji w celu uzyskania dostępu do konta Microsoft lub usługi OneDrive na platformie Azure
Zaloguj się do platformy Azure pod następującym adresem URL:
W polu wyszukiwania powyżej wpisz "rejestracje aplikacji" i wybierz je.
Kliknij przycisk Nowa rejestracja.
Treść "Nazwy" jest dowolna. Podaj opisową nazwę.
Wybierz "Obsługiwany typ konta" inny niż "Tylko osobiste konta Microsoft". Dzieje się tak, ponieważ, jak wspomniano powyżej, tego uwierzytelniania można używać tylko z kontami należącymi do organizacji. W tym przypadku wybraliśmy opcję "Konta w dowolnym katalogu organizacyjnym (dowolna dzierżawa Microsoft Entra ID — wielu dzierżawców) i osobiste konta Microsoft (Skype, Xbox itp.)".
Nie musisz wpisywać "Identyfikatora URI przekierowania", ponieważ tym razem nie będzie on używany.
Kiedy skończysz, kliknij przycisk "Zarejestruj się".
Nastąpi przekierowanie do strony podsumowania utworzonej rejestracji aplikacji, więc skopiuj identyfikator aplikacji (klienta) i identyfikator katalogu (dzierżawy). Użyjesz tej wartości później.
Wybierz pozycję "Certyfikaty i wpisy tajne" z kategorii zarządzania w menu po lewej stronie i upewnij się, że na środkowej karcie wybrano opcję "Wpisy tajne klienta". Kliknij pozycję Nowy klucz tajny klienta.
Wprowadzenie opisu jest opcjonalne. Jeśli chcesz nadal z niego korzystać, dołącz wyjaśnienie, które jasno wyjaśnia cel użycia.
"Data wygaśnięcia" to okres, w którym ten klucz tajny klienta jest ważny. Ponieważ tym razem służy do celów testowych, jest to 90 dni, ale proszę ustawić go zgodnie z celem użytkowania.
Po utworzeniu klucza tajnego klienta jest on dodawany do listy. W tym celu użyjemy wartości w kolumnie "Wartość", więc skopiuj ją. Należy pamiętać, że tej wartości nie można później skopiować.
Następnie wybierz "Uprawnienia API" z kategorii Administracja w menu po lewej stronie i kliknij "Dodaj uprawnienia" pośrodku.
W żądaniu uprawnień interfejsu API kliknij pozycję Microsoft Graph.
Kliknij opcję Zezwalaj na aplikację. Ta opcja nie jest dostępna w przypadku osobistych kont Microsoft.
Lista uprawnień zostanie wyświetlona poniżej, więc użyj pola wyszukiwania, aby sprawdzić następujące elementy.
- Files.ReadWrite.All
To wystarczy, jeśli chcesz korzystać tylko z OneDrive, ale jeśli chcesz uzyskać dostęp do czegokolwiek innego, dodaj uprawnienia. Uprawnienia wymagane do uzyskania dostępu do OneDrive można znaleźć na oficjalnej stronie poniżej.
Po dokonaniu wyboru kliknij przycisk Dodaj uprawnienia.
Dodany zostanie dodany do listy, a "Typ" to "Aplikacja". Ponieważ jednak "Status" to "Nie przyznano XXXX", kliknij "Udziel administratorowi zgody na XXXX". (XXXX to nazwa Twojej organizacji)
Kliknij przycisk Tak.
Zmienia się do stanu przyznanego.
Nawiasem mówiąc, możesz usunąć "delegowanego użytkownika.Read", który jest tam od początku, ponieważ tym razem go nie użyjemy. Jeśli dodałeś "User.Read" jako aplikację, użyj jej.
Weryfikowanie identyfikatorów użytkowników
Ponieważ będziesz uzyskiwać dostęp do usługi OneDrive, którą ma użytkownik docelowy, sprawdź wcześniej identyfikator użytkownika.
Microsoft Entra ID
i otwórz go.
Wybierz Użytkownicy z menu po lewej stronie.
Zostanie wyświetlona lista użytkowników, więc kliknij użytkownika docelowego.
Zanotuj "Identyfikator obiektu", ponieważ będzie to identyfikator użytkownika.
Tworzenie aplikacji konsolowej
Uruchom program Visual Studio i utwórz projekt dla aplikacji konsolowej. Można go utworzyć poza programem Visual Studio, ale na razie będę używać programu Visual Studio.
Lokalizacja i nazwa projektu są opcjonalne. W tym przypadku nazwa projektu to OneDriveApiDotNetClientCredentialsHttpClient
.
Tym razem nie będziemy dzielić kodu, ale Program.cs
napiszemy go naprzemiennie od góry, więc jeśli możesz sprawdzić ruch, przepisz go, dzieląc kod według potrzeb.
using System.Runtime.Serialization.Json;
using System.Text;
using System.Text.Json;
using System.Web;
using System.Xml;
Opisz przestrzeń nazw, której chcesz użyć.
// 認証結果を格納するクラスです
public record TokenResponse(string token_type, int expires_in, int ext_expires_in, string access_token);
Ta klasa służy do odbierania informacji o tokenie po uwierzytelnieniu.
Program.cs
, napisz go na końcu kodu.
Możesz oddzielić tę klasę od innych plików.
// 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());
}
Jest to magiczna metoda, która formatuje tekst JSON otrzymany z interfejsu API za pomocą wcięcia. Ponieważ jest to kod pobrany z Internetu, nie będę szczegółowo wyjaśniał jego zawartości.
// 各種 ID などの定義
var clientId = "XXXXXXXX"; // クライアント ID
var tenantId = "XXXXXXXX"; // テナント ID
var clientSecret = "XXXXXXXX"; // クライアント シークレット
var userId = "XXXXXXXX"; // ユーザー ID
var accessToken = ""; // アクセストークン
Ustaw identyfikator uzyskany na platformie Azure dla każdego z nich.
accessToken
jest tymczasowym tokenem służącym do uzyskiwania dostępu do usługi OneDrive, więc jest ustawiany w czasie wykonywania.
// 各種 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";
Adres URL interfejsu API do uwierzytelniania i adres URL interfejsu API, aby uzyskać listę folderów w katalogu głównym OneDvie. Jest to opis tego, jak sprawdzić dostęp do API OneDrive, więc nie będę opisywał zawartości API OneDrive. Jeśli masz dostęp do interfejsu API OneDrive, przesyłanie i pobieranie jest aplikacją, więc nie sądzę, aby było to takie trudne.
// 使いまわすので最初に定義しておく
HttpClient httpClient = new();
Wygenerowano polecenie , aby wysłać żądanie na HttpClient
określony adres 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}");
Najpierw wyślesz żądanie do interfejsu API uwierzytelniania z danymi, więc przygotuj te dane. Format danych, które mają zostać wysłane, to ciąg parametrów zapytania w formacie "Nazwa1=Wartość1&Nazwa2=Wartość2...", więc jest on tworzony w słowniku, a następnie konwertowany na ciąg parametrów zapytania.
Do wysłania należy wysłać cztery parametry:
Przykładowe wartości nazw parametrów | |
---|---|
client_id | Ustaw identyfikator klienta uzyskany podczas rejestracji aplikacji. |
zakres | Uwierzytelnianie przy użyciu klucza tajnego klienta jest stałe https://graph.microsoft.com/.default . |
client_secret | Ustaw wartość klucza tajnego klienta uzyskanego podczas rejestracji aplikacji. |
grant_type | Ponieważ jest to uwierzytelnianie za pomocą klucza tajnego klienta, client_credentials będzie to |
Więcej informacji można znaleźć na następującej oficjalnej stronie internetowej.
// 認証処理
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
, aby wysłać żądanie do interfejsu API uwierzytelniania. HttpClient
Jest to powszechne użycie, więc nie sądzę, aby było na co zwracać uwagę.
Dane, które mają zostać wysłane, muszą być zakodowane w UTF8, a Content-Type powinien mieć wartość application/x-www-form-urlencoded
. Metoda to POST
.
Jeśli odpowiedź zostanie sprawdzona i przetworzona pomyślnie IsSuccessStatusCode
, otrzymasz wynik jako ciąg JSON.
Otrzymany kod JSON ma następujące parametry:
{
"token_type": "Bearer",
"expires_in": 3599,
"ext_expires_in": 3599,
"access_token": "XXXXXXXXXXXXXXX"
}
W tym access_token
celu użyjemy . Użyj tej wartości z interfejsem API usługi OneDrive.
Pozostałe parametry można zignorować, aleaccess_token
jeśli chcesz poznać datę wygaśnięcia programu , użyj expires_in
.
Jest trudny do użycia jako ciąg JSON, więc JsonSerializer.Deserialize
deserializujemy go za pomocą, a następnie access_token
pobieramy .
// 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)}");
}
Na koniec użyj tokenu dostępu, aby wysłać żądanie do interfejsu API usługi OneDrive.
Metoda określa GET
, ale zależy to od typu interfejsu API, więc zapoznaj się z dokumentacją interfejsu API usługi OneDrive.
Dodaj token dostępu do nagłówka. Ustaw klucz jako Authorization
i wartość w formacie Bearer {アクセストークン}
.
Wszystko, co musisz zrobić, to wysłać żądanie i otrzymać wynik jako ciąg JSON. Teraz, gdy upewniamy się, że mamy dostęp do interfejsu API usługi OneDrive, po prostu formatujemy ciąg JSON i drukujemy go w konsoli. W rzeczywistości deserializuje otrzymany kod JSON i odpowiednio go przetwarza.
Tym razem otrzymałem listę folderów, ale myślę, że kod JSON jest następujący.
{
"@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": "フォルダ名"
}
},
:
]
}
Nie sądzę, że potrzebujesz wszystkich informacji, więc jeśli chcesz uzyskać tylko nazwę folderu, na przykład, możesz value
pobrać tylko parametry z name
tablicy w .
Streszczenie
Jeśli do tej pory działa dobrze, powinieneś być w stanie uzyskać dostęp do OneDrive za pomocą programu wsadowego. Nie wiem, czy wskazówki podsumowują metody przesyłania i pobierania, ale w zasadzie powinno to zadziałać, jeśli zastosujesz listę folderów w katalogu głównym opisanym powyżej. Typy interfejsów API są podsumowane na oficjalnej stronie internetowej poniżej, więc znajdź interfejs API, którego chcesz używać i zaimplementuj go.
dzięki
Tym razem miałem kilka pytań dotyczących korzystania z interfejsu API OneDrive, więc zadałem pytanie.