2016-10-01 6 views
2

バージョン1.xのMicrosoft.OneDriveSDK nugetパッケージを使用するXamarinベースのアプリケーションがあります。このアプリケーションでは、Xamarin.Authを使用してOAuthを管理し、そのフレームワークからaccess_tokenを取得します。Microsoft.OneDriveSDK v1をv2に移行する方法は?

OneDriveSDK 1.xでは、いくつかのクラスを再定義してこのアクセストークンを提供し、APIでトークンを取得しようとすることはありませんでした。

バージョン2に移行して、以前のクラスが置き換えられ、APIがMicrosoft.Graphのnugetパッケージを代わりに使用していることに気付きました。だから私は、インタフェースIAuthenticationProviderを実装しなければならなかったし、このようにそれをやった:

public async Task AuthenticateRequestAsync(HttpRequestMessage request) 
    { 
     if (!string.IsNullOrEmpty(MicrosoftLiveOAuthProvider.Instance.AccessToken)) 
     { 
      request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("bearer", MicrosoftLiveOAuthProvider.Instance.AccessToken); 
     } 
    } 

コードが呼び出され、適切にリクエストヘッダに認証トークンを提供します。しかし、SDKがトークンを使用しようとすると、例外が発生します。

'Microsoft.Graph.ServiceException'型の例外がスローされました。

コード:InvalidAuthenticationToken

メッセージ:CompactTokenの解析ができませんでした。エラーコード:-2147184118

は今、このメッセージは、Googleを使用して、常にトークンはJWT準拠していないとSDKが続いとしてそれを使用すると述べましたマイクロソフトライブ口座トークン。しかし、これが当てはまる場合、なぜV2で失敗するのだろうが、V1で動作するのだろうか。

https://login.live.com/oauth20_authorize.srf

すべてのヘルプは非常にMICHが高く評価されています

認証がに対して行われます!

答えて

3

私はサブクラス化Xamarin.Auth WebRedirectAuthenticatorMicrosoft.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; 
} 
+0

おかげで多くのことをこの包括的な答えのために!一方、OneDriveのアプリケーションを登録した地域では、委任やアプリケーションの資格情報などのMicrosoft Graphの権限も定義できるようになりました。私はこれも設定しなければならないと確信しています。さらに、V2 AuthエンドポイントはAzure ADまたはMicrosoft Liveのいずれかであるとの記述があります。私は現在Microsoft Liveに対してのみ認証していますので、MS Graphの主な利点はなくなりました。 – eX0du5

+0

私はoauth2に対してのみLive Acctを使用しています。あなたのAndroidバージョンでできるように、C#OneDrive SDKでGraphを使用しない方法があればいいと思います。しかし、それを使用してログインをスキップし、2つのインターフェースを実装するだけでうまく動作します。幸いにも、xamarinリンカは、未使用のグラフコードをすべて取り除き、アプリケーションのサイズは管理可能です – SushiHangover

関連する問題