web-dev-qa-db-ja.com

ユーザーの操作なしでC#ログインしてOneDriveにアップロード

私は現在、Excelファイルをチェックして更新し、選択したクラウドストレージ(SharePointまたはOneDrive)にアップロードするWindowsサービスに取り組んでいます。プロセス全体は完全に自動化され、ユーザーとの対話は不要です。必要なすべての情報(ユーザー名、パスワードなど)は構成ファイルの一部です。

OneDriveパーツ以外はすべて順調です。ログインしてこのクラウドストレージにアップロードするための完全に自動化されたソリューションを見つけることができません。私はMicrosoft Live SDKについて知っていますが、「WinPhone以外のアプリと-WinStoreアプリのサポートは減少しています。また、私の知る限り、ユーザー名とパスワード(Webブラウザーコンポーネント)を入力する必要があります。

2番目のオプションはSkyDriveClientAPI( ここにリンク )ですが、このAPIは機能しません(「問題」で説明)。

ユーザーの操作なしでLive SDKを使用する方法はありますか、または別の方法について他に提案がありますか?

17
TheUlderico

これは部分的に達成可能です

他の回答で述べたように、1つのドライブにはユーザー認証が必要です。これにより、完全な自動ソリューションが不可能になります。

ただし、ほぼ自動のソリューションが可能です。つまり、1回のログイン(最初のアクティベーション)とその後のログインを必要とするアプリを作成できます。 、実行中のアプリに対するユーザーの承認。その時点からアプリは自動的に機能します(アップロード、ダウンロード、フォルダの作成、アップロードされたファイルへの直接リンクなど...)。これは、アプリケーションがシャットダウンされ、マシンが再起動されます。

1つのドライブ接続からアプリケーションを切り離す唯一の方法は、アプリをサインアウトすることです(自動的に実行できます)。

これは、LIVE sdk(デスクトップ)を使用して実現でき、シングルサインオンガイドラインに従うと、ほとんどの場合、次のスコープにアクセスする必要があります。

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

1つのドライブ開発センターを確認します。

この動作を実現するには、次の手順に従うことをお勧めします。

サンプルを使用して基本的なデモアプリを作成した後:

  • アプリを拡張してシングルサインオン機能を使用する、
  • アプリを拡張して認証トークンを更新する(セッションがタイムアウトしないようにするなど)
4
Curious Guy

あなたは彼らのAPIについての情報を見つけることができます ここ 。 MicrosoftのOne Driveは本当に安全でユーザーのプライバシーを尊重することを目指しています。これが、プラットフォームに非常に多くの権限コントロールが存在する理由です。彼らは、ユーザーの許可なしに、孤立したファイルやアプリケーションが自動化されたアップロードプロセスを悪用しないようにしたいという願望を強調しています。 APIから直接明確にするために、明示的なガイドラインは次のとおりです。

OneDriveと対話するアプリのガイドライン

OneDriveとやり取りするアプリは、次の原則に準拠する必要があります:明示的なユーザーの要求または選択に応じてのみファイルをOneDriveにアップロードします。アプリでは、ユーザーが新しいデータをOneDriveに保存することを意図的に選択していることを常に確認する必要があります。アプリは、ユーザーがファイルをアップロードする明示的な選択を行わない限り、ファイルをOneDriveに自動的にアップロードしてはなりません。以下は、適合するアプリの例です。

  • 写真、ビデオ、ドキュメント、またはその他のファイルをアップロードする前にユーザーがクリックしなければならない[OneDriveにアップロード]または[OneDriveで共有]ボタンを表示するアプリ。

  • ユーザーが最初に「OneDriveにアップロード」ボタンをクリックする必要があるドキュメント編集アプリ。これにより、アプリは、ユーザーがさらに操作することなく、後でそのドキュメントを保存できます。

以下は、不適合アプリの例です。

  • ユーザーのデバイスの特定の場所に追加されたファイルをOneDriveに自動的にアップロードするアプリ。

  • ファイルまたはフォルダーをOneDriveに自動的にバックアップするアプリ。

OneDriveは、得意なことに使用できます。 OneDriveには、高品質のドキュメントの表示と編集、および美しいフォトアルバムの作成と共有の両方の機能が含まれています。可能であれば、アプリでこれらの機能を利用してください。 OneDriveへの信頼を損なうことはありません。 OneDriveが利用可能になった長年にわたって、ユーザーはそれを信頼するようになりました。信頼を維持することは重要であり、特にデータのプライバシーに関して、ユーザーが期待しないことを行うことでアプリが信頼を損なうことがあってはなりません。

以下は適合アプリの例です。

  • ドキュメントまたは写真をOneDriveにアップロードし、デフォルトでユーザーのみのアクセス権を持つアプリ。

  • OneDriveに保存されているコンテンツへのリンクをユーザーが送信すると、そのリンクを受け取ったユーザーは誰でも関連ファイルを読み取ることができることをユーザーに警告するアプリ。

これは不適合アプリの例です:

  • この動作をユーザーに明確に伝えることなく、OneDriveのすべての共有ファイルをデフォルトでパブリックにアクセスできるようにするアプリ。

上記の特定の抜粋は、One DriveのAPIに直接関連する here からのものです。

共有のOne Driveフォルダを使用して、ユーザーのプロセスを回避できます。自動的にデータをアップロード/同期します。ただし、落とし穴は、File.MoveまたはFile.Copyユーザーに明示的に伝えることなくこのファイルは共有ファイルに保存され、One Driveによってアップロードされます。次に、条件に違反する可能性があります。

そのアプローチを実装するには、ユーザー関連の権限/アカウントについても考慮する必要があります。

3
Greg

OneDriveは、ファイルをアップロードするためのAPIを提供します。ただし、 guidelines の制限の1つは、APIを介したすべてのアップロードをユーザーが開始するか、受け入れて使用する必要があることです。したがって、完全に自動化されたプロセスとしてOneDriveにファイルをアップロードすることはできません。

そのため、1つの解決策として、コメントで大まかに提案されているものがあります。ファイルをローカルのOneDriveフォルダーにコピーし、OneDriveアプリケーションがアップロードを処理できるようにします。

2
AKG

回答に2年遅れましたが、今後の利用に役立つと思います。

アプリケーションを登録すると、ポップアップウィンドウなしでアクセストークンを取得できます。この投稿を参照してください Getting Access Token for Microsoft Graph Using OAuth REST API 。トークンの取得方法(郵便配達員の例)、私はこの郵便配達人の例に基づいて次のコードを書きました:

ポップアップウィンドウなしでトークンを取得するためのC#の例:

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

トークンを取得したら、簡単にサインインできます。

1
Nehorai