web-dev-qa-db-fra.com

Connexion C # et téléchargement sur OneDrive sans interaction avec l'utilisateur

Je travaille actuellement sur un service Windows qui vérifiera et mettra à jour les fichiers Excel et les téléchargera sur le stockage cloud sélectionné - SharePoint ou OneDrive. L'ensemble du processus doit être entièrement automatique et sans aucune intervention de l'utilisateur - toutes les informations requises (nom d'utilisateur, mot de passe, etc.) font partie du fichier de configuration.

Tout se passe bien sauf la partie OneDrive. Je ne parviens pas à trouver une solution entièrement automatique pour vous connecter et télécharger vers ce stockage cloud. Je connais Microsoft Live SDK, mais "sa prise en charge des applications non WinPhone et -WinStore est réduite et, à ma connaissance, elle nécessite toujours que l'utilisateur saisisse son nom d'utilisateur, son mot de passe (composant webbrowser).

La deuxième option est SkyDriveClientAPI ( lien ici ), mais cette API ne fonctionne plus (comme mentionné dans Problèmes).

Existe-t-il un moyen d'utiliser Live SDK sans interaction avec l'utilisateur ou avez-vous d'autres suggestions pour une manière différente?

17
TheUlderico

Ceci est partiellement réalisable

Comme mentionné dans les autres réponses, un lecteur nécessite une authentification utilisateur , ce qui rend impossible une solution entièrement automatique.

Cependant, une solution presque automatique est possible , ce qui signifie qu'une application peut être créée qui nécessitera une connexion unique (lors de la première activation) et une suite à la connexion , une autorisation de l'utilisateur pour l'application en cours d'exécution, à partir de ce moment, l'application pourra fonctionner automatiquement (téléchargement, téléchargement, création de dossier, lien direct vers les fichiers téléchargés, etc.), cela continuera de fonctionner, même si l'application est arrêtée et la machine est redémarrée.

la seule façon de désengager l'application de la connexion à un lecteur est de déconnecter l'application (peut être effectuée automatiquement).

Cela peut être réalisé en utilisant le LIVE sdk (bureau) et en suivant les directives de connexion unique, vous aurez très probablement besoin d'accéder aux étendues suivantes:

  • wl.basic
  • wl.signin
  • wl.skydrive_update
  • wl.offline_access

vérifier un centre de développement d'entraînement:

Afin d'atteindre ce comportement, je suggère de suivre les étapes suivantes:

Après avoir utilisé l'exemple pour créer une application de démonstration de base:

  • améliorez votre application pour utiliser des fonctionnalités d'authentification unique,
  • améliorez votre application pour actualiser son jeton d'authentification (donc la session n'expirera pas, etc.)
4
Curious Guy

Vous pouvez trouver des informations sur leur API ici . One Drive de Microsoft vise vraiment à être sécurisé et à respecter la confidentialité des utilisateurs. C'est pourquoi tant de contrôles d'autorisation existent dans la plateforme. Ils soulignent vraiment le désir de ne pas avoir de fichiers ou d'applications orphelins abusant du processus automatisé/de téléchargement sans que l'utilisateur n'en ait donné la permission. Pour clarifier directement à partir de leur API, leurs directives explicites sont les suivantes:

Instructions pour les applications qui interagissent avec OneDrive

Les applications qui interagissent avec OneDrive doivent respecter ces principes: télécharger des fichiers vers OneDrive uniquement en réponse à une demande ou à un choix explicite de l'utilisateur. Vos applications doivent toujours garantir qu'un utilisateur choisit intentionnellement d'enregistrer de nouvelles données sur OneDrive. Les applications ne doivent pas télécharger automatiquement des fichiers sur OneDrive sans qu'un utilisateur ait explicitement choisi de télécharger ces fichiers. Voici quelques exemples d'applications conformes:

  • Les applications qui affichent un bouton "Télécharger sur OneDrive" ou "Partager sur OneDrive" sur lequel un utilisateur doit cliquer avant chaque téléchargement d'une photo, vidéo, document ou autre fichier.

  • Applications de modification de documents qui nécessitent qu'un utilisateur clique initialement sur un bouton "Télécharger sur OneDrive", afin que l'application puisse enregistrer ce document plus tard sans autre interaction de l'utilisateur.

Voici quelques exemples d'applications non conformes:

  • Applications qui téléchargent automatiquement sur OneDrive tout fichier ajouté à un emplacement spécifique sur les appareils d'un utilisateur.

  • Des applications qui sauvegardent automatiquement des fichiers ou des dossiers sur OneDrive.

Utilisez OneDrive pour les choses pour lesquelles il est bon. OneDrive comprend des fonctionnalités à la fois pour la visualisation et l'édition de documents de haute qualité, et pour créer et partager de magnifiques albums photo. Si possible, faites profiter vos applications de ces fonctionnalités. Ne sape pas la confiance dans OneDrive. Au fil des ans que OneDrive a été disponible, les utilisateurs ont fini par lui faire confiance. Préserver cette confiance est essentiel et vos applications ne doivent pas la saper en faisant des choses auxquelles les utilisateurs ne s'attendent pas, en particulier en ce qui concerne la confidentialité des données.

Voici quelques exemples d'applications conformes:

  • Applications qui téléchargent des documents ou des photos sur OneDrive avec un accès utilisateur uniquement par défaut.

  • Des applications qui avertissent les utilisateurs que, lorsque les utilisateurs envoient un lien vers leur contenu stocké sur OneDrive, toute personne qui reçoit ce lien peut lire les fichiers associés.

Voici un exemple d'application non conforme:

  • Une application qui rend tous les fichiers partagés dans OneDrive accessibles au public par défaut, sans communiquer clairement ce comportement aux utilisateurs.

Cet extrait particulier ci-dessus provient de ici qui est directement en corrélation avec l'API de One Drive.

Vous pouvez contourner le processus de l'utilisateur en utilisant le dossier One Drive partagé. Qui téléchargera/synchronisera automatiquement les données. Le piège est que si vous utilisez le File.Move ou File.Copy sans en informer explicitement l'utilisateur ce fichier sera stocké dans votre fichier partagé pour être téléchargé par One Drive. Vous pourriez alors violer les conditions.

Vous devrez également vous soucier des autorisations/comptes liés à l'utilisateur pour implémenter cette approche.

3
Greg

OneDrive propose une API pour télécharger des fichiers. Mais l'une des limites de leurs directives est que tous les téléchargements via l'API doivent être initiés par l'utilisateur ou acceptés. Vous ne pouvez donc pas télécharger de fichiers sur OneDrive en tant que processus entièrement automatique.

Une solution peut donc être aussi gooly suggérée dans un commentaire. Copiez les fichiers dans le dossier OneDrive local et laissez l'application OneDrive s'occuper du téléchargement.

2
AKG

Deux ans de retard pour répondre, mais je pense que cela sera utile pour une utilisation future.

Une fois que vous avez enregistré votre application, vous pouvez obtenir un jeton d'accès sans la fenêtre contextuelle , voir cet article Obtenir un jeton d'accès pour Microsoft Graph en utilisant OAuth REST API . Comment obtenir un jeton (un exemple de facteur), j'ai écrit le code suivant basé sur cet exemple de facteur:

Un exemple en c # pour obtenir un token sans la fenêtre popup:

public async Task GetTokenAsync(string tenant, string clientId, string clientSecret, string username, string password)
{
    HttpResponseMessage resp;
    using (var httpClient = new HttpClient())
    {
        httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));
        var req = new HttpRequestMessage(HttpMethod.Post, $"https://login.microsoftonline.com/{tenant}/oauth2/token/");
         req.Content = new FormUrlEncodedContent(new Dictionary<string, string>
         {
            {"grant_type", "password"},
            {"client_id", clientId},
            {"client_secret", clientSecret},
            {"resource", "https://graph.Microsoft.com"},
            {"username", username},
            {"password", password}
         });

         resp = await httpClient.SendAsync(req);
         string content = await resp.Content.ReadAsStringAsync();
         var jsonObj = new JavaScriptSerializer().Deserialize<dynamic>(content);               
         string token = jsonObj["access_token"];                
         Console.WriteLine(token);
    }
}

Une fois que vous avez un jeton, il est facile de se connecter.

1
Nehorai