Использование API OneDrive без взаимодействия с пользователем, например пакетной программы (версия .NET C#) (без дополнительных библиотек)
Операционная среда
- Визуальная студия
-
- Визуальная студия 2022
- .СЕТЬ
-
- .NET 8
- API проверки подлинности Майкрософт
-
- 2.0 OAuth 2
- Microsoft OneDrive API
-
- 1.0
- Типы учетных записей Майкрософт
-
- Рабочий или учебный аккаунт
Необходимые условия
- Визуальная студия
-
- Одна из версий
- .СЕТЬ
-
- Одна из версий
- API проверки подлинности Майкрософт
-
- 2.0 OAuth 2
- Microsoft OneDrive API
-
- 1.0
- Типы учетных записей Майкрософт
-
- Рабочий или учебный аккаунт
О цели данного мероприятия
Теперь вы будете использовать API OneDrive, чтобы подготовиться к программной отправке и скачиванию файлов в OneDrive. В этой статье мы рассмотрим, что можно сделать с помощью API OneDrive, поэтому не будем вдаваться в подробности о том, что можно сделать с помощью API OneDrive. Однако, если у вас есть возможность подключиться, вы можете прочитать документацию API и применить ее после этого.
Как запустить программу
Доступ к OneDrive не зависит от формы программы, такой как веб-приложение, настольное приложение или консольное приложение, и может выполняться различными программами. В этом случае мы создадим консольное приложение и выполним его автоматически без каких-либо действий со стороны пользователя.
Какие существуют типы учетных записей Майкрософт?
Если вы когда-либо создавали учетную запись Microsoft, вы, вероятно, видели ее. Существует два основных типа учетных записей Майкрософт: личные учетные записи Майкрософт и рабочие или учебные учетные записи. OneDrive привязан к учетной записи Microsoft, но тип OneDrive немного различается в зависимости от типа учетной записи, указанного выше.
На данный момент OneDrive API можно использовать с обоими вышеуказанными типами учетных записей. В этой программе в виде "создано как консольное приложение и выполняется без действий пользователя", Обратите внимание, что его можно использовать только с учетной записью Майкрософт в учетной записи «Рабочая или учебная учетная запись». Это связано с различиями в методах аутентификации.
О способе аутентификации
Во-первых, необходимо пройти проверку подлинности, чтобы получить доступ к OneDrive программным способом. Как уже упоминалось выше, любая программа может получить доступ к OneDrive, но аутентификация для подключения к API зависит от того, как работает программа. Веб-приложения и настольные приложения могут быть аутентифицированы путем взаимодействия с пользователем. Поскольку пользователь не может управлять им в консольном приложении, которое работает в фоновом режиме, метод аутентификации также отличается от описанного выше.
Я не знаю подробную причину, потому что мне не удалось ее найти, но если это приходит на ум, кажется, это связано с безопасностью и управлением учетными записями. Могу только сказать, что это уже спецификация, так что если вы хотите программно получить доступ к OneDrive, связанному с «личной учетной записью Microsoft», Я думаю, что нет другого выбора, кроме как использовать программу, отличную от программы, которая работает в фоновом режиме, или запустить консольное приложение с методом аутентификации, который включает в себя пользовательские операции.
В настоящее время мы не будем использовать библиотеку для доступа к API OneDrive
Доступ к API OneDrive относительно прост в использовании библиотеки под названием «Microsoft Graph». В этом случае мы будем использовать метод прямого доступа к URL API и его выполнения. Это немного громоздко, но поскольку он не использует библиотеку, у него есть преимущество, заключающееся в том, что non-.NET программы могут получать доступ к API OneDrive таким же образом. Это также предотвращает недостаток, заключающийся в том, что код меняется из-за разных версий библиотеки.
Мы покажем вам, как использовать Microsoft Graph, в другом совете.
предварительное условие
- У вас есть учетная запись Майкрософт для рабочей или учебной учетной записи
- Вы можете использовать OneDrive, связанный с учетной записью Microsoft, указанной выше (например, OneDrive Business)
- Установлена Visual Studio 2022
Настройка приложения для доступа к учетной записи Майкрософт или OneDrive в Azure
Войдите в Azure по следующему URL-адресу:
В поле поиска выше введите «регистрация приложений» и выберите его.
Нажмите «Новая регистрация».
Содержание «Имени» является произвольным. Пожалуйста, введите описательное имя.
Выберите "Поддерживаемый тип учетной записи", отличный от "Только личные учетные записи Microsoft". Это связано с тем, что, как упоминалось выше, эту аутентификацию можно использовать только с учетными записями, принадлежащими организации. В данном случае мы выбрали "Учетные записи в любом каталоге организации (любой клиент Microsoft Entra ID - мультитенантный) и личные учетные записи Microsoft (Skype, Xbox и т.д.)".
Вам не нужно вводить «URI перенаправления», потому что в этот раз он не будет использоваться.
Когда все будет готово, нажмите кнопку «Регистрация».
Вы перейдете на страницу сводки по созданной вами регистрации приложения, поэтому скопируйте идентификатор приложения (клиента) и идентификатор каталога (клиента). Вы будете использовать это значение позже.
Выберите «Сертификаты и секреты» в категории управления в левом меню и убедитесь, что выбран пункт «Секреты клиента» на средней вкладке. Нажмите «Новый секрет клиента».
Ввод описания не является обязательным. Если вы хотите продолжить его использование, пожалуйста, включите объяснение, которое четко объясняет цель использования.
«Дата истечения срока действия» — это период времени, в течение которого этот секрет клиента действителен. Поскольку на этот раз он предназначен для тестирования, он составляет 90 дней, но, пожалуйста, установите его в соответствии с целью использования.
Когда вы создаете секрет клиента, он добавляется в список. В этом случае мы будем использовать значение в столбце "Значение", поэтому скопируйте его. Обратите внимание, что это значение не может быть скопировано позже.
Затем выберите «Разрешения API» в категории «Администрирование» в левом меню и нажмите «Добавить разрешения» посередине.
В запросе разрешения API щелкните Microsoft Graph.
Нажмите «Разрешить приложение». Этот параметр недоступен для личных учетных записей Майкрософт.
Список разрешений будет отображаться ниже, поэтому используйте поле поиска, чтобы проверить следующие пункты.
- Файлы.ЧитатьЗаписывать.Все
Этого достаточно, если вы хотите использовать только OneDrive, но если вы хотите получить доступ к чему-то еще, добавьте разрешения. Разрешения, необходимые для доступа к OneDrive, можно найти на официальной странице ниже.
После того, как вы сделали свой выбор, нажмите кнопку «Добавить разрешения».
Добавленный добавляется в список, а «Тип» — это «Приложение». Однако, поскольку в поле "Статус" указано "Не предоставлено ХХХХ", нажмите "Дать согласие администратора на ХХХХ". (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());
}
Это волшебный метод, который форматирует полученный от API текст JSON с отступами. Поскольку это код, взятый из интернета, я не буду подробно объяснять его содержимое.
// 各種 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. Это описание того, как проверить доступ к OneDrive API, поэтому я не буду описывать содержимое OneDrive API. Если у вас есть доступ к 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.
Добавьте маркер доступа в заголовок. Установите ключ as 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, поэтому я задал вопрос.