Utiliser l’API OneDrive sans interaction de l’utilisateur, tel qu’un programme de traitement par lots (version .NET C#) (pas de bibliothèques d’utilisation supplémentaires)

Page mise à jour :
Date de création de la page :

Environnement d’exploitation

Studio visuel
  • Visual Studio 2022
.FILET
  • .NET 8
API d’authentification Microsoft
  • 2.0 OAuth 2
Microsoft OneDrive API
  • 1.0
Types de comptes Microsoft
  • Compte professionnel ou scolaire

Conditions préalables

Studio visuel
  • L’une des versions
.FILET
  • L’une des versions
API d’authentification Microsoft
  • 2.0 OAuth 2
Microsoft OneDrive API
  • 1.0
Types de comptes Microsoft
  • Compte professionnel ou scolaire

À propos de l’objectif de cet événement

Vous allez maintenant utiliser les API OneDrive pour vous préparer au chargement et au téléchargement programmatiques de fichiers sur OneDrive. Dans cet article, nous allons voir ce que vous pouvez faire avec l’API OneDrive, nous n’aborderons donc pas ce que vous pouvez faire avec l’API OneDrive. Cependant, tant que vous pouvez vous connecter, vous pouvez lire la documentation de l’API et l’appliquer par la suite.

Comment exécuter le programme

L’accès à OneDrive ne dépend pas de la forme du programme, telle qu’une application web, une application de bureau ou une application console, et peut être exécuté par divers programmes. Dans ce cas, nous allons créer une application console et l’exécuter automatiquement sans aucune opération utilisateur.

Quels sont les différents types de comptes Microsoft ?

Si vous avez déjà créé un compte Microsoft, vous l’avez probablement vu. Il existe deux principaux types de comptes Microsoft : les comptes Microsoft personnels et les comptes professionnels ou scolaires. OneDrive est lié à un compte Microsoft, mais le type de OneDrive varie légèrement en fonction du type de compte répertorié ci-dessus.

Pour l’instant, l’API OneDrive peut être utilisée avec les deux types de comptes ci-dessus. Dans ce programme sous la forme de « créé en tant qu’application console et exécuté sans opération de l’utilisateur », Veuillez noter qu’il ne peut être utilisé qu’avec un compte Microsoft dans le compte « Compte professionnel ou scolaire ». Cela est dû aux différences dans les méthodes d’authentification.

À propos de la méthode d’authentification

Tout d’abord, vous devez vous authentifier pour accéder à OneDrive par programmation. Comme mentionné ci-dessus, n’importe quel programme peut accéder à OneDrive, mais l’authentification pour se connecter à l’API dépend de la façon dont le programme s’exécute. Les applications Web et les applications de bureau peuvent être authentifiées par l’interaction de l’utilisateur. Étant donné que l’utilisateur ne peut pas l’utiliser dans une application console qui s’exécute en arrière-plan, la méthode d’authentification est également différente de celle décrite ci-dessus.

Je ne connais pas la raison détaillée car je n’ai pas pu le vérifier, mais si cela me vient à l’esprit, cela semble être dû à la sécurité et à la gestion du compte. Je peux seulement dire qu’il s’agit déjà d’une spécification, donc si vous souhaitez accéder par programmation à OneDrive associé à un « compte Microsoft personnel », Je pense qu’il n’y a pas d’autre choix que d’utiliser un programme autre qu’un programme qui s’exécute en arrière-plan, ou d’exécuter une application console avec une méthode d’authentification qui inclut les opérations utilisateur.

Nous n’utiliserons pas la bibliothèque pour accéder à l’API OneDrive pour le moment

L’accès à l’API OneDrive est relativement facile à gérer à l’aide d’une bibliothèque appelée « Microsoft Graph ». Dans ce cas, nous utiliserons la méthode d’accès direct à l’URL de l’API et de son exécution. C’est un peu lourd, mais comme il n’utilise pas de bibliothèque, il a l’avantage que non-.NET programmes peuvent accéder à l’API OneDrive de la même manière. Cela évite également l’inconvénient que le code change en raison des différentes versions de la bibliothèque.

Nous vous montrerons comment utiliser Microsoft Graph dans un autre conseil.

condition préalable

  • Vous disposez d’un compte Microsoft pour un compte professionnel ou scolaire
  • Vous pouvez utiliser le OneDrive associé au compte Microsoft répertorié ci-dessus (par exemple, OneDrive Business)
  • Visual Studio 2022 installé

Configurer votre application pour accéder à votre compte Microsoft ou à OneDrive dans Azure

Connectez-vous à Azure à l’adresse URL suivante :

Dans le champ de recherche ci-dessus, tapez « inscriptions d’applications » et sélectionnez-le.

Cliquez sur Nouvelle inscription.

Le contenu du « Nom » est arbitraire. Entrez un nom descriptif.

Sélectionnez un « Type de compte pris en charge » autre que « Comptes Microsoft personnels uniquement ». En effet, comme mentionné ci-dessus, cette authentification ne peut être utilisée qu’avec des comptes appartenant à une organisation. Dans ce cas, nous avons sélectionné « Comptes dans n’importe quel annuaire organisationnel (n’importe quel locataire Microsoft Entra ID - multi-locataire) et comptes Microsoft personnels (Skype, Xbox, etc.) ».

Vous n’avez pas besoin d’entrer l'"URI de redirection » car il ne sera pas utilisé cette fois-ci.

Lorsque vous avez terminé, cliquez sur le bouton « S’inscrire ».

Vous serez redirigé vers la page récapitulative de l’inscription de l’application que vous avez créée, alors copiez l’ID de l’application (client) et l’ID du répertoire (locataire). Vous utiliserez cette valeur plus tard.

Sélectionnez « Certificats et secrets » dans la catégorie de gestion du menu de gauche, et assurez-vous que « Secrets client » est sélectionné dans l’onglet du milieu. Cliquez sur Nouvelle clé secrète client.

La saisie d’une description est facultative. Si vous souhaitez continuer à l’utiliser, veuillez inclure une explication qui explique clairement le but de l’utilisation.

La « date d’expiration » est la période de validité de cette clé secrète client. Comme il s’agit cette fois d’un test à des fins de test, il est de 90 jours, mais veuillez le régler en fonction de l’objectif d’utilisation.

Lorsque vous créez une clé secrète client, elle est ajoutée à la liste. Dans ce cas, nous utiliserons la valeur de la colonne « Valeur », alors copiez-la. Notez que cette valeur ne peut pas être copiée ultérieurement.

Ensuite, sélectionnez « Autorisations API » dans la catégorie Administration du menu de gauche et cliquez sur « Ajouter des autorisations » au milieu.

Dans la demande d’autorisation d’API, cliquez sur Microsoft Graph.

Cliquez sur Autoriser l’application. Cette option n’est pas disponible pour les comptes Microsoft personnels.

Une liste d’autorisations s’affichera ci-dessous, alors utilisez le champ de recherche pour vérifier les éléments suivants.

  • Fichiers.LireÉcrire.Tout

C’est suffisant si vous souhaitez uniquement utiliser OneDrive, mais si vous souhaitez accéder à autre chose, ajoutez des autorisations. Les autorisations requises pour accéder à OneDrive se trouvent sur la page officielle ci-dessous.

Une fois que vous avez fait vos sélections, cliquez sur le bouton Ajouter des autorisations.

L’ajouté est ajouté à la liste, et le « Type » est « Application ». Cependant, puisque le « Statut » est « Non accordé à XXXX », cliquez sur « Donner le consentement de l’administrateur à XXXX ». (XXXX est le nom de votre organisation)

Cliquez sur Oui.

Il passe à l’état accordé.

D’ailleurs, vous pouvez supprimer le « delegated User.Read » qui est là depuis le début car nous ne l’utiliserons pas cette fois-ci. Si vous avez ajouté « User.Read » en tant qu’application, utilisez-la.

Vérification des identifiants d’utilisateur

Étant donné que vous allez accéder au OneDrive de l’utilisateur cible, vérifiez l’ID utilisateur à l’avance.

Microsoft Entra ID et ouvrez-le.

Sélectionnez Utilisateurs dans le menu de gauche.

Une liste d’utilisateurs s’affichera, alors cliquez sur l’utilisateur cible.

Notez l'"ID de l’objet » car il s’agira de l’ID de l’utilisateur.

Création d’une application console

Démarrez Visual Studio et créez un projet pour votre application console. Vous pouvez le créer en dehors de Visual Studio, mais je vais utiliser Visual Studio pour l’instant.

L’emplacement et le nom du projet sont facultatifs. Dans ce cas, le nom du projet est OneDriveApiDotNetClientCredentialsHttpClient .

Cette fois, nous n’allons pas diviser le code, mais Program.cs l’écrire en quinconce à partir du haut, donc si vous pouvez vérifier le mouvement, veuillez le réécrire en divisant le code si nécessaire.

using System.Runtime.Serialization.Json;
using System.Text;
using System.Text.Json;
using System.Web;
using System.Xml;

Décrivez l’espace de noms que vous souhaitez utiliser.

// 認証結果を格納するクラスです
public record TokenResponse(string token_type, int expires_in, int ext_expires_in, string access_token);

Cette classe est utilisée pour recevoir des informations de jeton après l’authentification. Program.cs , veuillez l’écrire à la fin du code. Vous pouvez séparer cette classe dans d’autres fichiers.

// 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());
}

Il s’agit d’une méthode magique qui formate le texte JSON reçu de l’API avec indentation. Comme il s’agit d’un code récupéré sur Internet, je n’expliquerai pas le contenu en détail.

// 各種 ID などの定義
var clientId = "XXXXXXXX";      // クライアント ID
var tenantId = "XXXXXXXX";      // テナント ID
var clientSecret = "XXXXXXXX";  // クライアント シークレット
var userId = "XXXXXXXX";        // ユーザー ID
var accessToken = "";           // アクセストークン

Définissez l’ID obtenu sur Azure pour chacun. accessToken est un jeton temporaire permettant d’accéder à OneDrive, il est donc défini au moment de l’exécution.

// 各種 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";

L’URL de l’API pour l’authentification et l’URL de l’API pour obtenir la liste des dossiers à la racine de OneDvie. Il s’agit d’une description de la façon de vérifier l’accès à l’API OneDrive, je ne décrirai donc pas le contenu de l’API OneDrive. Si vous avez accès à l’API OneDrive, le téléchargement est une application, donc je ne pense pas que ce soit si difficile.

// 使いまわすので最初に定義しておく
HttpClient httpClient = new();

Vous avez généré un pour faire une requête à HttpClient l’URL spécifiée.

// 「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}");

Tout d’abord, vous allez envoyer une requête à l’API d’authentification avec des données, puis préparez ces données. Le format des données à envoyer est une chaîne de paramètres de requête au format « Nom1=Valeur1&Nom2=Valeur2... », elle est donc créée dans un dictionnaire puis convertie en chaîne de paramètres de requête.

Il y a quatre paramètres à envoyer :

Exemple de
valeurs de nom de paramètre
client_id Définissez l’ID client que vous avez obtenu lors de l’inscription de l’application.
portée L’authentification à l’aide d’une clé secrète client est corrigée https://graph.microsoft.com/.default .
client_secret Définissez la valeur de la clé secrète client que vous avez obtenue lors de l’inscription de l’application.
grant_type Puisqu’il s’agit d’une authentification avec une clé secrète client, client_credentials il sera

Pour plus d’informations, veuillez consulter le site officiel suivant.

// 認証処理
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 pour effectuer une demande à l’API d’authentification. HttpClient C’est un usage courant, donc je ne pense pas qu’il y ait grand-chose à quoi faire attention.

Les données à envoyer doivent être encodées en UTF8 et le Content-Type doit être application/x-www-form-urlencoded . La méthode est POST .

Si la IsSuccessStatusCode réponse est vérifiée et traitée avec succès, vous recevrez le résultat sous la forme d’une chaîne JSON. Le JSON que vous recevez comporte les paramètres suivants :

{
  "token_type": "Bearer",
  "expires_in": 3599,
  "ext_expires_in": 3599,
  "access_token": "XXXXXXXXXXXXXXX"
}

Dans ce cas, access_token nous utiliserons . Utilisez cette valeur avec l’API OneDrive. Vous pouvez ignorer les autres paramètres, maisaccess_token si vous voulez connaître la date d’expiration de , utilisez expires_in .

Il est difficile à utiliser comme une chaîne JSON, nous JsonSerializer.Deserialize le désérialisons donc avec puis access_token obtenons .

// 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)}");
}

Enfin, utilisez le jeton d’accès pour effectuer une requête à l’API OneDrive. La méthode spécifie GET , mais cela dépend du type d’API, consultez donc la documentation de l’API OneDrive.

Ajoutez le jeton d’accès à l’en-tête. Définissez la clé comme Authorization et la valeur au Bearer {アクセストークン} format .

Tout ce que vous avez à faire est de faire une requête et de recevoir le résultat sous forme de chaîne JSON. Maintenant que nous nous assurons simplement d’avoir accès à l’API OneDrive, nous formatons simplement la chaîne JSON et l’imprimons sur la console. En fait, il désérialise le JSON reçu et le traite en conséquence.

J’ai reçu une liste de dossiers cette fois-ci, mais je pense que le JSON est le suivant.

{
  "@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": "フォルダ名"
      }
    },
    :
  ]
}

Je ne pense pas que vous ayez besoin de toutes les informations, donc si vous voulez obtenir uniquement le nom du dossier, par exemple, vous value pouvez obtenir uniquement les paramètres du name tableau dans .

Résumé

Si cela fonctionne correctement jusqu’à présent, vous devriez pouvoir accéder à OneDrive avec un programme de traitement par lots. Je ne sais pas si les conseils résument les méthodes de téléchargement et de téléchargement, mais en gros, cela devrait fonctionner si vous appliquez la liste des dossiers à la racine décrite ci-dessus. Les types d’API sont résumés sur le site officiel ci-dessous, veuillez donc trouver l’API que vous souhaitez utiliser et l’implémenter.

merci

J’avais quelques questions sur l’utilisation de l’API OneDrive cette fois-ci, alors j’ai posé une question.