Utilitzeu l'API del OneDrive sense interacció de l'usuari, com ara un programa per lots (versió .NET C#) (sense biblioteques d'ús addicionals)
Entorn operatiu
- Visual Studio
-
- Visual Studio 2022
- .XARXA
-
- .NET 8
- API d'autenticació de Microsoft
-
- 2.0 OAuth 2
- Microsoft OneDrive API
-
- 1.0
- Tipus de comptes de Microsoft
-
- Compte de la feina o d'un centre educatiu
Prerequisits
- Visual Studio
-
- Una de les versions
- .XARXA
-
- Una de les versions
- API d'autenticació de Microsoft
-
- 2.0 OAuth 2
- Microsoft OneDrive API
-
- 1.0
- Tipus de comptes de Microsoft
-
- Compte de la feina o d'un centre educatiu
Sobre el propòsit d'aquest esdeveniment
Ara utilitzareu les API del OneDrive per preparar-vos per carregar i descarregar fitxers mitjançant programació al OneDrive. En aquest article, explicarem què podeu fer amb l'API del OneDrive, de manera que no entrarem en què podeu fer amb l'API del OneDrive. Tanmateix, sempre que us pugueu connectar, podeu llegir la documentació de l'API i aplicar-la després.
Com executar el programa
L'accés al OneDrive no depèn de la forma del programa, com ara una aplicació web, una aplicació d'escriptori o una aplicació de consola, i pot ser executat per diversos programes. En aquest cas, crearem una aplicació de consola i l'executarem automàticament sense cap operació de l'usuari.
Quins són els diferents tipus de comptes de Microsoft?
Si alguna vegada heu creat un compte de Microsoft, probablement l'heu vist. Hi ha dos tipus principals de comptes de Microsoft: comptes personals de Microsoft i comptes de la feina o d'un centre educatiu. OneDrive està lligat a un compte de Microsoft, però el tipus de OneDrive varia lleugerament segons el tipus de compte esmentat anteriorment.
De moment, l'API de OneDrive es pot utilitzar amb els dos tipus de comptes anteriors. En aquest programa en forma de "creat com a aplicació de consola i executat sense l'operació de l'usuari", Tingueu en compte que només es pot utilitzar amb un compte de Microsoft al compte "Compte de la feina o d'un centre educatiu". Això es deu a les diferències en els mètodes d'autenticació.
Sobre el mètode d'autenticació
En primer lloc, heu d'autenticar-vos per accedir al OneDrive mitjançant programació. Com s'ha esmentat anteriorment, qualsevol programa pot accedir a OneDrive, però l'autenticació per connectar-se a l'API depèn de com s'executi el programa. Les aplicacions web i les aplicacions d'escriptori es poden autenticar mitjançant la interacció de l'usuari. Com que l'usuari no pot operar-lo en una aplicació de consola que s'executa en segon pla, el mètode d'autenticació també és diferent de l'anterior.
No sé el motiu detallat perquè no he pogut buscar-lo, però si em ve al cap, sembla que es deu a la seguretat i la gestió del compte. Només puc dir que això ja és una especificació, de manera que si voleu accedir mitjançant programació a OneDrive associat a un "compte personal de Microsoft", Crec que no hi ha més remei que utilitzar un programa que no sigui un programa que s'executa en segon pla, o executar una aplicació de consola amb un mètode d'autenticació que inclogui operacions d'usuari.
No utilitzarem la biblioteca per accedir a l'API del OneDrive en aquest moment
L'accés a l'API de OneDrive és relativament fàcil de gestionar mitjançant una biblioteca anomenada "Microsoft Graph". En aquest cas, utilitzarem el mètode d'accedir directament a l'URL de l'API i executar-lo. És una mica feixuc, però com que no utilitza una biblioteca, té l'avantatge que non-.NET programes poden accedir a l'API de OneDrive de la mateixa manera. També evita el desavantatge que el codi canvia a causa de diferents versions de la biblioteca.
Us mostrarem com utilitzar Microsoft Graph en un altre consell.
Precondició
- Teniu un compte de Microsoft per a un compte de la feina o d'un centre educatiu
- Podeu utilitzar el OneDrive associat amb el compte de Microsoft esmentat anteriorment (per exemple, OneDrive Business)
- Visual Studio 2022 instal·lat
Configurar l'aplicació per accedir al vostre compte de Microsoft o OneDrive a Azure
Inicieu sessió a l'Azure a l'adreça URL següent:
Al camp de cerca anterior, escriviu "registres d'aplicacions" i seleccioneu-lo.
Feu clic a Registre nou.
El contingut del "Nom" és arbitrari. Introduïu un nom descriptiu.
Seleccioneu un "Tipus de compte compatible" que no sigui "Només comptes personals de Microsoft". Això es deu al fet que, com s'ha esmentat anteriorment, aquesta autenticació només es pot utilitzar amb comptes que pertanyen a una organització. En aquest cas, hem seleccionat "Comptes de qualsevol directori organitzatiu (qualsevol inquilí de Microsoft Entra ID - multiinquilí) i comptes personals de Microsoft (Skype, Xbox, etc.)".
No cal que introdueixis l'"URI de redirecció" perquè aquesta vegada no s'utilitzarà.
Quan hàgiu acabat, feu clic al botó "Registre".
Se us dirigirà a la pàgina de resum del registre de l'aplicació que heu creat, així que copieu l'identificador de l'aplicació (client) i l'identificador del directori (inquilí). Utilitzareu aquest valor més endavant.
Seleccioneu "Certificats i secrets" a la categoria de gestió del menú de l'esquerra i assegureu-vos que "Secrets de client" estigui seleccionat a la pestanya central. Feu clic a Nou secret de client.
Introduir una descripció és opcional. Si voleu continuar utilitzant-lo, si us plau, incloeu una explicació que expliqui clarament la finalitat de l'ús.
La "data de caducitat" és el període de temps que aquest secret de client és vàlid. Com que aquesta vegada és per provar, són 90 dies, però configureu-lo segons el propòsit d'ús.
Quan creeu un secret de client, s'afegeix a la llista. En això, utilitzarem el valor de la columna "Valor", així que copieu-lo. Tingueu en compte que aquest valor no es pot copiar més endavant.
A continuació, seleccioneu "Permisos API" a la categoria Administració al menú de l'esquerra i feu clic a "Afegeix permisos" al mig.
A la sol·licitud de permís de l'API, feu clic a Microsoft Graph.
Feu clic a Permet l'aplicació. Aquesta opció no està disponible per als comptes personals de Microsoft.
A continuació es mostrarà una llista de permisos, així que utilitzeu el camp de cerca per comprovar els elements següents.
- Fitxers.ReadWrite.All
Això és suficient si només voleu utilitzar OneDrive, però si voleu accedir a qualsevol altra cosa, afegiu permisos. Els permisos necessaris per accedir a OneDrive es poden trobar a la pàgina oficial següent.
Un cop hàgiu fet les seleccions, feu clic al botó Afegeix permisos.
L'afegit s'afegeix a la llista i el "Tipus" és "Aplicació". Tanmateix, com que l'"Estat" és "No concedit a XXXX", feu clic a "Dona el consentiment de l'administrador a XXXX". (XXXX és el nom de la vostra organització)
Feu clic a Sí.
Canvia a l'estat concedit.
Per cert, podeu eliminar el "User.Read delegat" que hi ha des del principi perquè no l'utilitzarem aquesta vegada. Si heu afegit "User.Read" com a aplicació, utilitzeu-la.
Verificació dels identificadors d'usuari
Com que accedireu al OneDrive que té l'usuari de destinació, comproveu l'identificador d'usuari amb antelació.
Microsoft Entra ID
i obrir-lo.
Seleccioneu Usuaris al menú de l'esquerra.
Es mostrarà una llista d'usuaris, així que feu clic a l'usuari de destinació.
Preneu nota de l'"ID de l'objecte", ja que serà l'ID d'usuari.
Crear una aplicació de consola
Inicieu Visual Studio i creeu un projecte per a l'aplicació de consola. Podeu crear-lo fora de Visual Studio, però de moment utilitzaré Visual Studio.
La ubicació i el nom del projecte són opcionals. En aquest cas, el nom del projecte és OneDriveApiDotNetClientCredentialsHttpClient
.
Aquesta vegada, no dividirem el codi, sinó Program.cs
que l'escriurem esglaonat des de la part superior, així que si podeu comprovar el moviment, reescriviu-lo dividint el codi segons sigui necessari.
using System.Runtime.Serialization.Json;
using System.Text;
using System.Text.Json;
using System.Web;
using System.Xml;
Descriu l'espai de noms que vols utilitzar.
// 認証結果を格納するクラスです
public record TokenResponse(string token_type, int expires_in, int ext_expires_in, string access_token);
Aquesta classe s'utilitza per rebre informació del testimoni després de l'autenticació.
Program.cs
, si us plau, escriviu-lo al final del codi.
Podeu separar aquesta classe en altres fitxers.
// 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());
}
Aquest és un mètode màgic que formata el text JSON rebut de l'API amb sagnat. Com que és un codi recollit d'Internet, no explicaré el contingut en detall.
// 各種 ID などの定義
var clientId = "XXXXXXXX"; // クライアント ID
var tenantId = "XXXXXXXX"; // テナント ID
var clientSecret = "XXXXXXXX"; // クライアント シークレット
var userId = "XXXXXXXX"; // ユーザー ID
var accessToken = ""; // アクセストークン
Definiu l'identificador obtingut a l'Azure per a cadascun.
accessToken
és un testimoni temporal per accedir al OneDrive, de manera que es defineix en temps d'execució.
// 各種 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 per a l'autenticació i l'URL de l'API per obtenir la llista de carpetes a l'arrel de OneDvie. Aquesta és una descripció de com comprovar l'accés a l'API del OneDrive, de manera que no descriuré el contingut de l'API del OneDrive. Si teniu accés a l'API de OneDrive, carregar i descarregar és una aplicació, així que no crec que sigui tan difícil.
// 使いまわすので最初に定義しておく
HttpClient httpClient = new();
Heu generat un per fer una sol·licitud a HttpClient
l'URL especificat.
// 「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}");
En primer lloc, fareu una sol·licitud a l'API d'autenticació amb dades, així que prepareu aquestes dades. El format de les dades que s'han d'enviar és una cadena de paràmetres de consulta en el format "Nom1=Valor1&Nom2=Valor2...", de manera que es crea en un diccionari i després es converteix en una cadena de paràmetres de consulta.
Hi ha quatre paràmetres que s'han d'enviar:
Exemplesde valors de nom de paràmetre | |
---|---|
client_id | Definiu l'identificador de client que heu obtingut al registre de l'aplicació. |
abast | L'autenticació amb un secret de client és fixa https://graph.microsoft.com/.default . |
client_secret | Definiu el valor del secret de client que heu obtingut al registre de l'aplicació. |
grant_type | Com que es tracta d'autenticació amb un secret de client, client_credentials serà |
Per a més informació, consulteu el següent lloc web oficial.
// 認証処理
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 fer una sol·licitud a l'API d'autenticació. HttpClient
És un ús comú, així que no crec que hi hagi gaire a què prestar atenció.
Les dades que s'han d'enviar han d'estar codificades en UTF8 i el tipus de contingut ha de ser application/x-www-form-urlencoded
. El mètode és POST
.
Si la IsSuccessStatusCode
resposta es comprova i es processa correctament, rebreu el resultat com a cadena JSON.
El JSON que rebeu té els paràmetres següents:
{
"token_type": "Bearer",
"expires_in": 3599,
"ext_expires_in": 3599,
"access_token": "XXXXXXXXXXXXXXX"
}
En això, access_token
utilitzarem . Utilitzeu aquest valor amb l'API del OneDrive.
Podeu ignorar els altres paràmetres, peròaccess_token
si voleu saber la data de caducitat de , utilitzeu expires_in
.
És difícil d'utilitzar com a cadena JSON, així que JsonSerializer.Deserialize
la deserialitzem amb i després access_token
obtenim .
// 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)}");
}
Finalment, utilitzeu el testimoni d'accés per fer una sol·licitud a l'API del OneDrive.
El mètode especifica GET
, però depèn del tipus d'API, així que consulteu la documentació de l'API del OneDrive.
Afegiu el testimoni d'accés a la capçalera. Definiu la clau com Authorization
i el valor en el Bearer {アクセストークン}
format .
Tot el que heu de fer és fer una sol·licitud i rebre el resultat com a cadena JSON. Ara que només ens estem assegurant que tenim accés a l'API de OneDrive, només estem formatant la cadena JSON i imprimint-la a la consola. De fet, deserialitza el JSON rebut i el processa en conseqüència.
Aquesta vegada he rebut una llista de carpetes, però crec que el JSON és el següent.
{
"@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": "フォルダ名"
}
},
:
]
}
No crec que necessiteu tota la informació, de manera que si voleu obtenir només el nom de la carpeta, per exemple, només podeu value
obtenir els paràmetres de name
la matriu a .
Resum
Si funciona bé fins ara, hauríeu de poder accedir a OneDrive amb un programa per lots. No sé si els consells resumeixen els mètodes de càrrega i descàrrega, però bàsicament hauria de funcionar si apliqueu la llista de carpetes a l'arrel descrita anteriorment. Els tipus d'API es resumeixen al lloc web oficial a continuació, així que cerqueu l'API que voleu utilitzar i implementeu-la.
gràcies
Aquesta vegada tenia algunes preguntes sobre l'ús de l'API de OneDrive, així que vaig fer una pregunta.