Unityメモ：UnityからOneDriveにアップロードやダウンロードしたい(更新中)

すまぬ。まだメモだけなんだ。なにか分かったら更新する(:3_ヽ)_
下書きが10個までだから溢れちゃうよな(:3_ヽ)_

# NuGetForUnityをインストール
ココ見ながらやります。
[Unity であらゆる C#(.NET) パッケージを使う（例：opencv）](https://qiita.com/kingyo222/items/11100e8f7be396b98453)

# Microsoft.OneDriveSDKをNuGetForUnityでインストール
1ボタンで依存パッケージを含めすべてインストールしてくれます。
が、不要なSystem系のものまでインストールされて、重複DLLが存在するというエラーも引き起こします。その時はNuGetForUnityの「Installed」タブを開いて不要なものをアンインストールしましょう（結構数があってめんどくさい）。

↓このgithubの内容が入っています。
[github - One Drive SDK C# Windows](https://github.com/onedrive/onedrive-sdk-csharp)

#Microsoft.Identity.ClientをNuGetForUnityでインストール

# Getting startedを順番に
アプリケーションを登録します。次の手順に従って、アプリケーションをOneDriveに登録します。

##API登録
[Microsoft Graph 用のアプリの登録](https://docs.microsoft.com/ja-jp/onedrive/developer/rest-api/getting-started/app-registration?view=odsp-graph-online)

##実装
[ドキュメント - Windows デスクトップ アプリから Microsoft Graph API を呼び出す](https://docs.microsoft.com/ja-jp/azure/active-directory/develop/tutorial-v2-windows-desktop)


#Microsoft.Identity.ClientはTaskを使用しているので少し参考に
[Unity2017で始めるTask(async～await)](https://qiita.com/divideby_zero/items/b6bbcc35aef08e1d7d3e)

↓まだエラーが出ますが、認証のサンプルをコピって使えるようにしていきます

```c#:MicrosoftGraphAuthentication.cs
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using Microsoft.Identity.Client;

public class MicrosoftGraphAuthentication : MonoBehaviour
{
	private static string ClientId = "";

	private static string Tenant = "common";

	private static IPublicClientApplication _clientApp;

	public static IPublicClientApplication PublicClientApp { get { return _clientApp; } }

	// Start is called before the first frame update
	void Start()
	{
		_clientApp = PublicClientApplicationBuilder.Create(ClientId)
			.WithAuthority(AzureCloudInstance.AzurePublic, Tenant)
			.Build();
	}

	//Set the API Endpoint to Graph 'me' endpoint
	string graphAPIEndpoint = "https://graph.microsoft.com/v1.0/me";

	//Set the scope for API call to user.read
	string[] scopes = new string[] { "user.read" };


	/// <summary>
	/// Call AcquireToken - to acquire a token requiring user to sign-in
	/// </summary>
	private async void CallGraphButton_Click()
	{
		AuthenticationResult authResult = null;
		//var app = App.PublicClientApp;
		var app = MicrosoftGraphAuthentication.PublicClientApp;
		ResultText.Text = string.Empty;
		TokenInfoText.Text = string.Empty;

		var accounts = await app.GetAccountsAsync();
		var firstAccount = accounts.FirstOrDefault();

		try {
			authResult = await app.AcquireTokenSilent(scopes, firstAccount)
				.ExecuteAsync();
		} catch (MsalUiRequiredException ex) {
			// A MsalUiRequiredException happened on AcquireTokenSilent.
			// This indicates you need to call AcquireTokenInteractive to acquire a token
			System.Diagnostics.Debug.WriteLine($"MsalUiRequiredException: {ex.Message}");

			try {
				authResult = await app.AcquireTokenInteractive(scopes)
					.WithAccount(accounts.FirstOrDefault())
					.WithPrompt(Prompt.SelectAccount)
					.ExecuteAsync();
			} catch (MsalException msalex) {
				ResultText.Text = $"Error Acquiring Token:{System.Environment.NewLine}{msalex}";
			}
		} catch (Exception ex) {
			ResultText.Text = $"Error Acquiring Token Silently:{System.Environment.NewLine}{ex}";
			return;
		}

		if (authResult != null) {
			ResultText.Text = await GetHttpContentWithToken(graphAPIEndpoint, authResult.AccessToken);
			DisplayBasicTokenInfo(authResult);
			this.SignOutButton.Visibility = Visibility.Visible;
		}
	}
}
```

(続く)

[~~github - サンプル~~](https://github.com/Azure-Samples/active-directory-dotnet-desktop-msgraph-v2/)

https://apps.dev.microsoft.com/#

#参照
[OneDrive/onedrive-sdk-csharp - Github](https://github.com/OneDrive/onedrive-sdk-csharp)
[C#からOneDrive API（４）　ファイルの保存、読み込み](http://kmycode.hatenablog.jp/entry/2017/04/02/110110)
[Unity + OneDrive = Corrupt Projects](https://www.reddit.com/r/Unity3D/comments/7qms3w/unity_onedrive_corrupt_projects/)