私はサブクラス化Xamarin.Auth WebRedirectAuthenticator
とMicrosoft.OneDriveSDK
v2.0.0を使用します。
私は経由して構築されていauthorizeUrl:
使用して、そのXamarin.Auth
サブクラスを経由して初期access_token
を得る:私はアクセスとリフレッシュトークンを持っていたら、私はOneDriveClient
コンストラクタに渡される必要がIHttpProvider
を実装することができます
string GetAuthorizeUrl()
{
var requestUriStringBuilder = new StringBuilder();
requestUriStringBuilder.Append(Consts.MicrosoftAccountAuthenticationServiceUrl);
requestUriStringBuilder.AppendFormat("?{0}={1}", Consts.RedirectUriKeyName, Consts.Redirect_URI);
requestUriStringBuilder.AppendFormat("&{0}={1}", Consts.ClientIdKeyName, Consts.Client_ID);
requestUriStringBuilder.AppendFormat("&{0}={1}", Consts.ResponseTypeKeyName, Consts.TokenKeyName);
requestUriStringBuilder.AppendFormat("&{0}={1}", Consts.ScopeKeyName, Consts.Drive_Scopes);
return Uri.EscapeUriString(requestUriStringBuilder.ToString());
}
を
public Task<HttpResponseMessage> SendAsync(HttpRequestMessage request)
{
SetupHttpClient();
return _httpClient.SendAsync(request);
}
public Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationToken cancellationToken)
{
SetupHttpClient();
return _httpClient.SendAsync(request, completionOption, cancellationToken);
}
HttpClient _httpClient;
void SetupHttpClient()
{
if (_httpClient == null)
{
_httpClient = new HttpClient();
var accessToken = _account.Properties["access_token"];
_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
}
}
あなたを使用してOneDriveClient
クライアントを作成します:HTTPヘッダにアクセストークンを設定するためとIHttpProvider
オブジェクト(すべてのOneDrive API呼び出しを構築しているのと同じクラスに実装しています)、すべてのOnDrive要求は保存されたAccount
のアクセストークンを使用します。
注:私のIAuthenticationProvider
の実装では現在のところ何もしませんが、ここではより洗練されたコードフローのためにAccount
の設定を行うことができます。
var oneDriveClient = new OneDriveClient("https://api.onedrive.com/v1.0", this, this);
var pictureFolderItem = await oneDriveClient.Drive.Root.ItemWithPath("Pictures").Request().GetAsync();
Console.WriteLine(pictureFolderItem.Folder);
リフレッシュは、それを更新しAccount
にそれを再保存するタイマーアクセストークンの有効期限が切れる(マイナス5分)になるとき、私は保存、ほとんど同じくらい簡単です設定。ユーザーは、このように利用可能とAccount
は以前にログインした場合、アプリの起動時に同じことを行い、有効期限が切れているかどうかを確認、それを更新し、セットアップ背景タイマー...時間を割いて
async Task<bool> GetRefreshToken(Account account)
{
// https://github.com/OneDrive/onedrive-api-docs/blob/master/auth/msa_oauth.md#step-3-get-a-new-access-token-or-refresh-token
OneDriveOAuth2Authenticator auth = OAuth2Authenticator();
var token = account.Properties["refresh_token"];
var expiresIn = await auth.RequestRefreshTokenAsync(token);
ResetRefreshTokenTimer(expiresIn);
return true;
}
おかげで多くのことをこの包括的な答えのために!一方、OneDriveのアプリケーションを登録した地域では、委任やアプリケーションの資格情報などのMicrosoft Graphの権限も定義できるようになりました。私はこれも設定しなければならないと確信しています。さらに、V2 AuthエンドポイントはAzure ADまたはMicrosoft Liveのいずれかであるとの記述があります。私は現在Microsoft Liveに対してのみ認証していますので、MS Graphの主な利点はなくなりました。 – eX0du5
私はoauth2に対してのみLive Acctを使用しています。あなたのAndroidバージョンでできるように、C#OneDrive SDKでGraphを使用しない方法があればいいと思います。しかし、それを使用してログインをスキップし、2つのインターフェースを実装するだけでうまく動作します。幸いにも、xamarinリンカは、未使用のグラフコードをすべて取り除き、アプリケーションのサイズは管理可能です – SushiHangover