Usare l'API di OneDrive senza l'interazione dell'utente, ad esempio un programma batch (versione .NET C#) (senza ulteriori librerie di utilizzo)

Pagina aggiornata :
Data di creazione della pagina :

Ambiente operativo

Studio visivo
  • Studio visivo 2022
.RETE
  • .NET 8
API di autenticazione Microsoft
  • 2.0 OAuth 2
Microsoft OneDrive API
  • 1.0
Tipi di account Microsoft
  • Account aziendale o dell'istituto di istruzione

Prerequisiti

Studio visivo
  • Una delle versioni
.RETE
  • Una delle versioni
API di autenticazione Microsoft
  • 2.0 OAuth 2
Microsoft OneDrive API
  • 1.0
Tipi di account Microsoft
  • Account aziendale o dell'istituto di istruzione

Informazioni sullo scopo di questo evento

A questo punto si useranno le API di OneDrive per prepararsi al caricamento e al download di file in OneDrive a livello di codice. In questo articolo, esamineremo le operazioni che è possibile eseguire con l'API di OneDrive, quindi non verranno illustrate le operazioni che è possibile eseguire con l'API di OneDrive. Tuttavia, finché riesci a connetterti, puoi leggere la documentazione dell'API e applicarla successivamente.

Come eseguire il programma

L'accesso a OneDrive non dipende dalla forma del programma, ad esempio un'applicazione Web, un'applicazione desktop o un'applicazione console, e può essere eseguito da un'ampia gamma di programmi. In questo caso, creeremo un'applicazione console e la eseguiremo automaticamente senza alcuna operazione da parte dell'utente.

Quali sono i diversi tipi di account Microsoft?

Se hai mai creato un account Microsoft, probabilmente l'hai visto. Esistono due tipi principali di account Microsoft: account Microsoft personali e account aziendali o dell'istituto di istruzione. OneDrive è legato a un account Microsoft, ma il tipo di OneDrive varia leggermente a seconda del tipo di account elencato sopra.

Per il momento, l'API di OneDrive può essere utilizzata con entrambi i tipi di account di cui sopra. In questo programma sotto forma di "creato come applicazione console ed eseguito senza l'intervento dell'utente", Tieni presente che può essere utilizzato solo con un account Microsoft nell'account "Account aziendale o dell'istituto di istruzione". Ciò è dovuto alle differenze nei metodi di autenticazione.

Informazioni sul metodo di autenticazione

Innanzitutto, è necessario eseguire l'autenticazione per accedere a OneDrive a livello di codice. Come accennato in precedenza, qualsiasi programma può accedere a OneDrive, ma l'autenticazione per connettersi all'API dipende da come è in esecuzione il programma. Le applicazioni Web e desktop possono essere autenticate tramite l'interazione dell'utente. Poiché l'utente non può utilizzarlo in un'applicazione console in esecuzione in background, anche il metodo di autenticazione è diverso da quello precedente.

Non conosco il motivo dettagliato perché non sono stato in grado di cercarlo, ma se mi viene in mente, sembra essere dovuto alla sicurezza e alla gestione dell'account. Posso solo dire che questa è già una specifica, quindi se vuoi accedere in modo programmatico a OneDrive associato a un "account Microsoft personale", Penso che non ci sia altra scelta se non quella di utilizzare un programma diverso da un programma che viene eseguito in background, oppure di eseguire un'applicazione console con un metodo di autenticazione che include le operazioni dell'utente.

Al momento non useremo la libreria per accedere all'API di OneDrive

L'accesso all'API di OneDrive è relativamente facile da gestire utilizzando una libreria chiamata "Microsoft Graph". In questo caso, utilizzeremo il metodo di accesso diretto all'URL dell'API e di esecuzione. È un po' macchinoso, ma poiché non utilizza una libreria, ha il vantaggio che i programmi non-.NET possono accedere all'API di OneDrive allo stesso modo. Inoltre, previene lo svantaggio che il codice cambia a causa di versioni diverse della libreria.

Ti mostreremo come utilizzare Microsoft Graph in un altro suggerimento.

precondizione

  • Si dispone di un account Microsoft per un account aziendale o dell'istituto di istruzione
  • È possibile utilizzare OneDrive associato all'account Microsoft elencato in precedenza (ad esempio, OneDrive Business)
  • Visual Studio 2022 installato

Configurare l'applicazione per accedere all'account Microsoft o a OneDrive in Azure

Accedere ad Azure all'URL seguente:

Dal campo di ricerca in alto, digita "registrazioni app" e selezionalo.

Fare clic su Nuova registrazione.

Il contenuto del "Nome" è arbitrario. Inserisci un nome descrittivo.

Seleziona un "Tipo di account supportato" diverso da "Solo account Microsoft personali". Questo perché, come accennato in precedenza, questa autenticazione può essere utilizzata solo con gli account che appartengono a un'organizzazione. In questo caso, abbiamo selezionato "Account in qualsiasi directory organizzativa (qualsiasi tenant ID Microsoft Entra - multi-tenant) e account Microsoft personali (Skype, Xbox, ecc.)".

Non è necessario inserire l'"URI di reindirizzamento" perché questa volta non verrà utilizzato.

Al termine, fai clic sul pulsante "Registrati".

Verrà visualizzata la pagina di riepilogo della registrazione dell'app creata, quindi copiare l'ID applicazione (client) e l'ID directory (tenant). Questo valore verrà usato in un secondo momento.

Seleziona "Certificati e segreti" dalla categoria di gestione nel menu a sinistra e assicurati che "Segreti client" sia selezionato nella scheda centrale. Fare clic su Nuovo segreto client.

L'immissione di una descrizione è facoltativa. Se si desidera continuare a utilizzarlo, si prega di includere una spiegazione che spieghi chiaramente lo scopo dell'uso.

La "data di scadenza" è il periodo di validità del segreto client. Poiché questa volta è a scopo di test, sono 90 giorni, ma si prega di impostarlo in base allo scopo di utilizzo.

Quando si crea un segreto client, questo viene aggiunto all'elenco. In questo, useremo il valore nella colonna "Valore", quindi copialo. Si noti che questo valore non può essere copiato in un secondo momento.

Quindi, seleziona "Autorizzazioni API" dalla categoria Amministrazione nel menu a sinistra e fai clic su "Aggiungi autorizzazioni" al centro.

Nella richiesta di autorizzazione API fare clic su Microsoft Graph.

Fare clic su Consenti applicazione. Questa opzione non è disponibile per gli account Microsoft personali.

Di seguito verrà visualizzato un elenco di autorizzazioni, quindi utilizza il campo di ricerca per controllare i seguenti elementi.

  • File.ReadWrite.All

Questo è sufficiente se vuoi solo usare OneDrive, ma se vuoi accedere a qualcos'altro, aggiungi le autorizzazioni. Le autorizzazioni necessarie per accedere a OneDrive sono disponibili nella pagina ufficiale sottostante.

Una volta effettuate le selezioni, fai clic sul pulsante Aggiungi autorizzazioni.

Quello aggiunto viene aggiunto all'elenco e il "Tipo" è "Applicazione". Tuttavia, poiché lo "Stato" è "Non concesso a XXXX", fare clic su "Concedi il consenso dell'amministratore a XXXX". (XXXX è il nome della tua organizzazione)

Fare clic su Sì.

Passa allo stato concesso.

A proposito, puoi eliminare il "Delegated User.Read" che è lì dall'inizio perché questa volta non lo utilizzeremo. Se è stato aggiunto "User.Read" come applicazione, utilizzarlo.

Verifica degli ID utente

Poiché accederai a OneDrive dell'utente di destinazione, controlla in anticipo l'ID utente.

Microsoft Entra ID e aprilo.

Seleziona Utenti dal menu a sinistra.

Verrà visualizzato un elenco di utenti, quindi fai clic sull'utente di destinazione.

Prendi nota dell'"ID oggetto" in quanto sarà l'ID utente.

Creare un'applicazione console

Avviare Visual Studio e creare un progetto per l'applicazione console. È possibile crearlo all'esterno di Visual Studio, ma per il momento utilizzerò Visual Studio.

La posizione e il nome del progetto sono facoltativi. In questo caso, il nome del progetto è OneDriveApiDotNetClientCredentialsHttpClient .

Questa volta, non divideremo il codice, ma Program.cs lo scriveremo sfalsato dall'alto, quindi se puoi controllare il movimento, per favore riscrivilo dividendo il codice secondo necessità.

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

Descrivi lo spazio dei nomi che desideri utilizzare.

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

Questa classe viene utilizzata per ricevere informazioni sul token dopo l'autenticazione. Program.cs , scrivilo alla fine del codice. È possibile separare questa classe in altri file.

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

Si tratta di un metodo magico che formatta il testo JSON ricevuto dall'API con l'indentazione. Trattandosi di un codice prelevato da Internet, non spiegherò il contenuto in dettaglio.

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

Impostare l'ID ottenuto in Azure per ognuno. accessToken è un token temporaneo per l'accesso a OneDrive, quindi viene impostato in fase di esecuzione.

// 各種 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 dell'API per l'autenticazione e l'URL dell'API per ottenere l'elenco delle cartelle nella directory principale di OneDvie. Questa è una descrizione di come controllare l'accesso all'API di OneDrive, quindi non descriverò il contenuto dell'API di OneDrive. Se hai accesso all'API di OneDrive, il caricamento e il download sono un'applicazione, quindi non credo che sia così difficile.

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

È stato generato un per effettuare una richiesta all'URL HttpClient specificato.

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

Innanzitutto, effettuerai una richiesta all'API di autenticazione con i dati, quindi prepara tali dati. Il formato dei dati da inviare è una stringa di parametro di query nel formato "Nome1=Valore1&Nome2=Valore2...", quindi viene creata in un dizionario e quindi convertita in una stringa di parametro di query.

I parametri da inviare sono quattro:

Esempi
di valori dei nomi dei parametri
client_id Impostare l'ID client ottenuto nella registrazione dell'app.
portata L'autenticazione con un segreto client è fissa https://graph.microsoft.com/.default .
client_secret Impostare il valore del segreto client ottenuto nella registrazione dell'app.
grant_type Poiché si tratta di autenticazione con un segreto client, client_credentials sarà

Per ulteriori informazioni, si prega di fare riferimento al seguente sito ufficiale.

// 認証処理
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 per effettuare una richiesta all'API di autenticazione. HttpClient È un uso comune, quindi non credo che ci sia molto a cui prestare attenzione.

I dati da inviare devono essere codificati UTF8 e il tipo di contenuto deve essere application/x-www-form-urlencoded . Il metodo è POST .

Se la IsSuccessStatusCode risposta viene controllata ed elaborata correttamente, riceverai il risultato come stringa JSON. Il codice JSON ricevuto ha i parametri seguenti:

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

In questo, access_token useremo . Usare questo valore con l'API OneDrive. Puoi ignorare gli altri parametri, maaccess_token se vuoi conoscere la data di scadenza di , usa expires_in .

È difficile da usare come stringa JSON, quindi JsonSerializer.Deserialize la deserializziamo con e poi access_token otteniamo .

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

Infine, utilizza il token di accesso per effettuare una richiesta all'API di OneDrive. Il metodo specifica GET , ma dipende dal tipo di API, quindi controlla la documentazione dell'API di OneDrive.

Aggiungere il token di accesso all'intestazione. Impostare la chiave come Authorization e il valore nel Bearer {アクセストークン} formato .

Tutto quello che devi fare è fare una richiesta e ricevere il risultato come stringa JSON. Ora che ci stiamo solo assicurando di avere accesso all'API di OneDrive, stiamo semplicemente formattando la stringa JSON e stampandola nella console. Infatti, deserializza il codice JSON ricevuto e lo elabora di conseguenza.

Questa volta ho ricevuto un elenco di cartelle, ma penso che il JSON sia il seguente.

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

Non credo che tu abbia bisogno di tutte le informazioni, quindi se vuoi ottenere solo il nome della cartella, ad esempio, puoi value ottenere solo i parametri dall'array name in .

Sommario

Se finora funziona correttamente, dovresti essere in grado di accedere a OneDrive con un programma batch. Non so se i suggerimenti riassumono i metodi di caricamento e download, ma fondamentalmente dovrebbe funzionare se si applica l'elenco delle cartelle nella radice descritta sopra. I tipi di API sono riassunti sul sito Web ufficiale di seguito, quindi trova l'API che desideri utilizzare e implementala.

Grazie

Questa volta avevo alcune domande sull'uso dell'API di OneDrive, quindi ho fatto una domanda.