Gunakan API OneDrive tanpa interaksi pengguna, seperti program kelompok (versi .NET C#) (tiada perpustakaan penggunaan tambahan)
Persekitaran operasi
- Visual Studio
-
- Visual Studio 2022
- .BERSIH
-
- .NET 8
- API Pengesahan Microsoft
-
- 2.0 OAuth 2
- Microsoft OneDrive API
-
- 1.0
- Jenis akaun Microsoft
-
- Akaun kerja atau sekolah
Prasyarat
- Visual Studio
-
- Salah satu versi
- .BERSIH
-
- Salah satu versi
- API Pengesahan Microsoft
-
- 2.0 OAuth 2
- Microsoft OneDrive API
-
- 1.0
- Jenis akaun Microsoft
-
- Akaun kerja atau sekolah
Mengenai tujuan acara ini
Kini anda akan menggunakan API OneDrive untuk menyediakan anda untuk memuat naik dan memuat turun fail secara pengaturcaraan ke OneDrive. Dalam artikel ini, kami akan membincangkan perkara yang boleh anda lakukan dengan API OneDrive, jadi kami tidak akan membincangkan perkara yang boleh anda lakukan dengan API OneDrive. Walau bagaimanapun, selagi anda boleh menyambung, anda boleh membaca dokumentasi API dan menggunakannya selepas itu.
Bagaimana untuk menjalankan program
Akses kepada OneDrive tidak bergantung pada bentuk program, seperti aplikasi web, aplikasi desktop atau aplikasi konsol, dan boleh dijalankan oleh pelbagai program. Dalam kes ini, kami akan membuat aplikasi konsol dan melaksanakannya secara automatik tanpa sebarang operasi pengguna.
Apakah jenis akaun Microsoft yang berbeza?
Jika anda pernah mencipta akaun Microsoft, anda mungkin pernah melihatnya. Terdapat dua jenis akaun Microsoft utama: akaun Microsoft peribadi dan akaun kerja atau sekolah. OneDrive terikat pada akaun Microsoft, tetapi jenis OneDrive berbeza sedikit bergantung pada jenis akaun yang disenaraikan di atas.
Buat masa ini, API OneDrive boleh digunakan dengan kedua-dua jenis akaun di atas. Dalam program ini dalam bentuk "dicipta sebagai aplikasi konsol dan dilaksanakan tanpa operasi pengguna", Sila ambil perhatian bahawa ia hanya boleh digunakan dengan akaun Microsoft dalam akaun "Akaun kerja atau sekolah". Ini disebabkan oleh perbezaan dalam kaedah pengesahan.
Perihal kaedah pengesahan
Pertama, anda mesti mengesahkan untuk mengakses OneDrive secara pengaturcaraan. Seperti yang dinyatakan di atas, mana-mana program boleh mengakses OneDrive, tetapi pengesahan untuk menyambung ke API bergantung pada cara program berjalan. Aplikasi web dan aplikasi desktop boleh disahkan oleh interaksi pengguna. Memandangkan pengguna tidak boleh mengendalikannya dalam aplikasi konsol yang berjalan di latar belakang, kaedah pengesahan juga berbeza daripada yang di atas.
Saya tidak tahu sebab terperinci kerana saya tidak dapat mencarinya, tetapi jika terlintas di fikiran, nampaknya disebabkan oleh keselamatan dan pengurusan akaun. Saya hanya boleh mengatakan bahawa ini sudah menjadi spesifikasi, jadi jika anda ingin mengakses OneDrive secara pengaturcaraan yang dikaitkan dengan "akaun Microsoft peribadi", Saya berpendapat bahawa tidak ada pilihan selain menggunakan program selain daripada program yang berjalan di latar belakang, atau menjalankan aplikasi konsol dengan kaedah pengesahan yang merangkumi operasi pengguna.
Kami tidak akan menggunakan perpustakaan untuk mengakses API OneDrive pada masa ini
Akses kepada API OneDrive agak mudah dikendalikan menggunakan perpustakaan yang dipanggil "Microsoft Graph". Dalam kes ini, kami akan menggunakan kaedah mengakses URL API secara langsung dan melaksanakannya. Ia agak membebankan, tetapi kerana ia tidak menggunakan perpustakaan, ia mempunyai kelebihan bahawa program non-.NET boleh mengakses API OneDrive dengan cara yang sama. Ia juga menghalang kelemahan bahawa kod berubah disebabkan oleh versi perpustakaan yang berbeza.
Kami akan menunjukkan kepada anda cara menggunakan Microsoft Graph dalam petua lain.
prasyarat
- Anda mempunyai akaun Microsoft untuk akaun kerja atau sekolah
- Anda boleh menggunakan OneDrive yang dikaitkan dengan akaun Microsoft yang disenaraikan di atas (cth., OneDrive Business)
- Visual Studio 2022 dipasang
Sediakan aplikasi anda untuk mengakses akaun Microsoft atau OneDrive anda dalam Azure
Log masuk ke Azure di URL berikut:
Daripada medan carian di atas, taip "pendaftaran aplikasi" dan pilihnya.
Klik Pendaftaran Baharu.
Kandungan "Nama" adalah sewenang-wenangnya. Sila masukkan nama deskriptif.
Pilih "Jenis akaun yang disokong" selain daripada "Akaun Microsoft peribadi sahaja." Ini kerana, seperti yang dinyatakan di atas, pengesahan ini hanya boleh digunakan dengan akaun yang dimiliki oleh organisasi. Dalam kes ini, kami telah memilih "Akaun dalam mana-mana direktori organisasi (mana-mana penyewa ID Microsoft Entra - berbilang penyewa) dan akaun Microsoft peribadi (Skype, Xbox, dll.)".
Anda tidak perlu memasukkan "URI ubah hala" kerana ia tidak akan digunakan kali ini.
Apabila anda selesai, klik butang "Daftar".
Anda akan dibawa ke halaman ringkasan pendaftaran aplikasi yang anda buat, jadi salin ID Aplikasi (klien) dan ID Direktori (penyewa). Anda akan menggunakan nilai ini kemudian.
Pilih "Sijil & rahsia" daripada kategori pengurusan di menu kiri, dan pastikan "Rahsia pelanggan" dipilih di tab tengah. Klik Rahsia Pelanggan Baharu.
Memasukkan Perihalan adalah pilihan. Jika anda ingin terus menggunakannya, sila sertakan penjelasan yang menerangkan dengan jelas tujuan penggunaan.
"Tarikh tamat tempoh" ialah tempoh masa rahsia pelanggan ini sah. Oleh kerana ia adalah untuk tujuan ujian kali ini, ia adalah 90 hari, tetapi sila tetapkannya mengikut tujuan penggunaan.
Apabila anda mencipta rahsia klien, ia ditambah pada senarai. Dalam hal ini, kami akan menggunakan nilai dalam lajur "Nilai", jadi salinlah. Ambil perhatian bahawa nilai ini tidak boleh disalin kemudian.
Seterusnya, pilih "Kebenaran API" daripada kategori Pentadbiran di menu kiri dan klik "Tambah Kebenaran" di tengah.
Dalam permintaan keizinan API, klik Microsoft Graph.
Klik Benarkan Permohonan. Pilihan ini tidak tersedia untuk akaun Microsoft peribadi.
Senarai kebenaran akan dipaparkan di bawah, jadi gunakan medan carian untuk menyemak item berikut.
- Fail.ReadWrite.All
Itu sudah cukup jika anda hanya mahu menggunakan OneDrive, tetapi jika anda ingin mengakses apa-apa lagi, tambahkan kebenaran. Kebenaran yang diperlukan untuk mengakses OneDrive boleh didapati di halaman rasmi di bawah.
Sebaik sahaja anda telah membuat pilihan anda, klik butang Tambah Kebenaran.
Yang ditambahkan ditambahkan pada senarai, dan "Jenis" ialah "Aplikasi". Walau bagaimanapun, memandangkan "Status" ialah "Tidak diberikan kepada XXXX", klik "Berikan kebenaran pentadbir kepada XXXX". (XXXX ialah nama organisasi anda)
Klik Ya.
Ia berubah kepada keadaan yang diberikan.
Dengan cara ini, anda boleh memadamkan "User.Read yang diwakilkan" yang ada dari awal kerana kami tidak akan menggunakannya kali ini. Jika anda menambah "User.Read" sebagai aplikasi, gunakannya.
Mengesahkan ID Pengguna
Memandangkan anda akan mengakses OneDrive yang dimiliki oleh pengguna sasaran, semak ID pengguna terlebih dahulu.
Microsoft Entra ID
dan bukanya.
Pilih Pengguna daripada menu di sebelah kiri.
Senarai pengguna akan dipaparkan, jadi klik pada pengguna sasaran.
Catat "ID Objek" kerana ia akan menjadi ID pengguna.
Buat aplikasi konsol
Mulakan Visual Studio dan buat projek untuk aplikasi konsol anda. Anda boleh menciptanya di luar Visual Studio, tetapi saya akan menggunakan Visual Studio buat masa ini.
Lokasi dan nama projek adalah pilihan. Dalam kes ini, nama projek ialah OneDriveApiDotNetClientCredentialsHttpClient
.
Kali ini, kami tidak akan membahagikan kod, tetapi Program.cs
akan menulisnya secara berperingkat-peringkat dari atas, jadi jika anda boleh menyemak pergerakan, sila tulis semula dengan membahagikan kod mengikut keperluan.
using System.Runtime.Serialization.Json;
using System.Text;
using System.Text.Json;
using System.Web;
using System.Xml;
Terangkan ruang nama yang anda mahu gunakan.
// 認証結果を格納するクラスです
public record TokenResponse(string token_type, int expires_in, int ext_expires_in, string access_token);
Kelas ini digunakan untuk menerima maklumat token selepas pengesahan.
Program.cs
, sila tulis di akhir kod.
Anda boleh memisahkan kelas ini ke dalam fail lain.
// 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());
}
Ini ialah kaedah ajaib yang memformat teks JSON yang diterima daripada API dengan lekukan. Oleh kerana ia adalah kod yang diambil dari Internet, saya tidak akan menerangkan kandungannya secara terperinci.
// 各種 ID などの定義
var clientId = "XXXXXXXX"; // クライアント ID
var tenantId = "XXXXXXXX"; // テナント ID
var clientSecret = "XXXXXXXX"; // クライアント シークレット
var userId = "XXXXXXXX"; // ユーザー ID
var accessToken = ""; // アクセストークン
Tetapkan ID yang diperoleh pada Azure untuk setiap satu.
accessToken
ialah token sementara untuk mengakses OneDrive, jadi ia ditetapkan pada masa jalan.
// 各種 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 untuk pengesahan dan URL API untuk mendapatkan senarai folder di akar OneDvie. Ini ialah penerangan tentang cara menyemak akses kepada API OneDrive, jadi saya tidak akan menerangkan kandungan API OneDrive. Jika anda mempunyai akses kepada API OneDrive, memuat naik dan memuat turun ialah aplikasi, jadi saya rasa ia tidak begitu sukar.
// 使いまわすので最初に定義しておく
HttpClient httpClient = new();
Anda telah menjana a untuk membuat permintaan kepada HttpClient
URL yang ditentukan.
// 「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}");
Mula-mula, anda akan membuat permintaan kepada API pengesahan dengan data, jadi sediakan data tersebut. Format data yang akan dihantar ialah rentetan parameter pertanyaan dalam format "Name1=Value1&Name2=Value2...", jadi ia dicipta dalam kamus dan kemudian ditukar kepada rentetan parameter pertanyaan.
Terdapat empat parameter yang akan dihantar:
ContohNilai | Nama Parameter |
---|---|
client_id | Tetapkan ID klien yang anda perolehi dalam pendaftaran aplikasi. |
Skop | Pengesahan dengan rahsia pelanggan telah ditetapkan https://graph.microsoft.com/.default . |
client_secret | Tetapkan nilai rahsia pelanggan yang anda perolehi dalam pendaftaran aplikasi. |
grant_type | Oleh kerana ia adalah pengesahan dengan rahsia pelanggan, client_credentials ia akan menjadi |
Untuk maklumat lanjut, sila rujuk laman web rasmi berikut.
// 認証処理
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
untuk membuat permintaan kepada API pengesahan. HttpClient
Ia adalah penggunaan biasa, jadi saya rasa tidak banyak yang perlu diberi perhatian.
Data yang akan dihantar mestilah dikodkan UTF8 dan Jenis Kandungan hendaklah . application/x-www-form-urlencoded
Kaedahnya ialah POST
.
Jika IsSuccessStatusCode
respons disemak dan berjaya diproses, anda akan menerima hasilnya sebagai rentetan JSON.
JSON yang anda terima mempunyai parameter berikut:
{
"token_type": "Bearer",
"expires_in": 3599,
"ext_expires_in": 3599,
"access_token": "XXXXXXXXXXXXXXX"
}
Dalam hal ini, access_token
kita akan menggunakan . Gunakan nilai ini dengan API OneDrive.
Anda boleh mengabaikan parameter lain, tetapiaccess_token
jika anda ingin mengetahui tarikh tamat tempoh , gunakan expires_in
.
Sukar untuk digunakan sebagai rentetan JSON, jadi JsonSerializer.Deserialize
kami menyahserialkannya dengan dan kemudian access_token
mendapatkan.
// 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)}");
}
Akhir sekali, gunakan token akses untuk membuat permintaan kepada API OneDrive.
Kaedah ini menentukan GET
, tetapi ia bergantung pada jenis API, jadi semak dokumentasi API OneDrive.
Tambah token akses pada pengepala. Tetapkan kunci sebagai Authorization
dan nilai dalam Bearer {アクセストークン}
format .
Apa yang anda perlu lakukan ialah membuat permintaan dan menerima hasilnya sebagai rentetan JSON. Sekarang kami hanya memastikan kami mempunyai akses kepada API OneDrive, kami hanya memformat rentetan JSON dan mencetaknya ke konsol. Malah, ia menyahsiri JSON yang diterima dan memprosesnya dengan sewajarnya.
Saya telah menerima senarai folder kali ini, tetapi saya rasa JSON adalah seperti berikut.
{
"@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": "フォルダ名"
}
},
:
]
}
Saya tidak fikir anda memerlukan semua maklumat, jadi jika anda hanya ingin mendapatkan nama folder, sebagai contoh, anda value
hanya boleh mendapatkan parameter daripada name
tatasusunan dalam .
Ringkasan
Jika ia berfungsi dengan baik setakat ini, anda sepatutnya boleh mengakses OneDrive dengan program kelompok. Saya tidak tahu sama ada petua meringkaskan kaedah memuat naik dan memuat turun, tetapi pada asasnya ia sepatutnya berfungsi jika anda menggunakan senarai folder dalam akar yang diterangkan di atas. Jenis API diringkaskan di laman web rasmi di bawah, jadi sila cari API yang anda ingin gunakan dan laksanakannya.
Terima kasih
Saya mempunyai beberapa soalan tentang menggunakan API OneDrive kali ini, jadi saya bertanya soalan.