Microsoft.OneDriveSDK v1をv2に移行する方法は?

eX0du5

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

OneDriveSDK 1.xを使用すると、いくつかのクラスを再定義することでこのアクセストークンを提供でき、APIがトークンをフェッチしようとすることはありませんでした。

バージョン2に移行したいと思ったところ、以前のクラスが置き換えられ、APIが代わりにMicrosoft.Graphnugetパッケージを使用するようになりました。そのため、インターフェイス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はそれをMicrosoftライブアカウントトークンとして使用します。しかし、これが当てはまる場合、なぜV2で失敗するのに、V1では機能するのか疑問に思います。

認証は以下に対して行われます:

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

どんな助けでも大歓迎です!

SushiHangover

サブクラス化されたXamarin.AuthWebRedirectAuthenticatorMicrosoft.OneDriveSDKv2.0.0で使用ます。

以下をaccess_token介して構築されたをXamarin.Auth使用して、authorizeUrl:そのサブクラスを介してイニシャルを取得します

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

アクセストークンと更新トークンを取得したら、httpヘッダーにアクセストークンを設定するためにコンストラクターにIHttpProvider渡す必要のあるものを実装OneDriveClientできます。

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を使用しクライアントを作成し(すべてのOneDrive API呼び出しを構築しているのと同じクラスに実装するだけです)、すべてのOnDrive要求は保存されからのアクセストークンを使用しますIAuthenticationProviderIHttpProviderAccount

注:私のIAuthenticationProvider実装はAuthenticateRequestAsync現在何もしていませんが、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);

更新はほぼ同じくらい簡単です。アクセストークンの有効期限が切れるとき(マイナス5分)を保存し、タイマーを設定して更新し、に再保存しAccountます。アプリの起動時に同じことを行います。ユーザーが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;
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

OAuthの空の白いウィンドウを表示するOneDriveSDK

分類Dev

Python OneDriveSDKを使用してMSSharePointにファイルをアップロードする

分類Dev

OneDriveSDKを使用して別のユーザーのドライブにアクセスする

分類Dev

OneDriveSDKデモitemNotFoundエラー

分類Dev

AWS SDKのv1からv2への移行:WithSubscriber()を正しく実装する方法は?

分類Dev

v1とv2を知っている場合、Func <v1、v2、out1>をFunc <out1>にキャストする方法はありますか?

分類Dev

v1とv2を知っている場合、Func <v1、v2、out1>をFunc <out1>にキャストする方法はありますか?

分類Dev

bashでmultimap <K、V>を<K、{V1、V2}>のマップに変換する方法

分類Dev

Overleaf v1およびv2:overleafのプロジェクトを削除する方法は?

分類Dev

build.gradleファイルからV1(Jar署名)またはV2(完全APK署名)を使用する方法

分類Dev

V2からV3SurveymonkeyAPIに移行する方法

分類Dev

2つのstd :: vectors v1とv2があり、これらを構造体に結合したくないとします。v1がソートによって変換されたのと同じ方法でv2を変換する方法は?

分類Dev

stream()を使用してMap <v1、Set <v2 >>をJavaでMap <v2、Set <v1 >>に反転するにはどうすればよいですか?

分類Dev

Compiling Azure Function v1 (.NET Framework) gives FileNotFoundException for Microsoft.Azure.WebJobs

分類Dev

コンソールアプリでのOneDriveSDK認証の問題

分類Dev

iOS OneDriveSDK-非推奨のUIWebViewの更新が必要

分類Dev

実行時に変数V1に含まれる変数V2を更新するにはどうすればよいですか?

分類Dev

v1をv2に変換するAzure関数DotNetStandard'AzureWebJobsServiceBus 'がないか、空です

分類Dev

koa v1 から v2 への移行

分類Dev

指定されたIDで2列v1とv2の平均と標準偏差をとる関数を書く方法はありますか?

分類Dev

Login with personal Microsoft accounts failes to Oauth2 v2

分類Dev

Microsoft Office設定を移行するにはどうすればよいですか?

分類Dev

AzureADのバージョンがV1かV2かを確認するにはどうすればよいですか?

分類Dev

STLなしでC ++でedge(v1、v2)リストを作成するにはどうすればよいですか?

分類Dev

Microsoft.Office365.Discovery-CapabilityDiscoveryResult-> Office 365 V2 DLLを使用した後、ServiceEndpointUriのURiが間違っています

分類Dev

React-trancition-group。.v1から.v2への移行後の移行は機能しません

分類Dev

Microsoftロゴアニメーションv2

分類Dev

「V2」ストレージアカウントを「V1」にダウングレードすることは可能ですか?

分類Dev

Azure Function v2は、Microsoft.NET.Sdk.Functionsよりも新しいバージョンのNewtonsoft.Jsonを持つプロジェクトを参照します

Related 関連記事

  1. 1

    OAuthの空の白いウィンドウを表示するOneDriveSDK

  2. 2

    Python OneDriveSDKを使用してMSSharePointにファイルをアップロードする

  3. 3

    OneDriveSDKを使用して別のユーザーのドライブにアクセスする

  4. 4

    OneDriveSDKデモitemNotFoundエラー

  5. 5

    AWS SDKのv1からv2への移行:WithSubscriber()を正しく実装する方法は?

  6. 6

    v1とv2を知っている場合、Func <v1、v2、out1>をFunc <out1>にキャストする方法はありますか?

  7. 7

    v1とv2を知っている場合、Func <v1、v2、out1>をFunc <out1>にキャストする方法はありますか?

  8. 8

    bashでmultimap <K、V>を<K、{V1、V2}>のマップに変換する方法

  9. 9

    Overleaf v1およびv2:overleafのプロジェクトを削除する方法は?

  10. 10

    build.gradleファイルからV1(Jar署名)またはV2(完全APK署名)を使用する方法

  11. 11

    V2からV3SurveymonkeyAPIに移行する方法

  12. 12

    2つのstd :: vectors v1とv2があり、これらを構造体に結合したくないとします。v1がソートによって変換されたのと同じ方法でv2を変換する方法は?

  13. 13

    stream()を使用してMap <v1、Set <v2 >>をJavaでMap <v2、Set <v1 >>に反転するにはどうすればよいですか?

  14. 14

    Compiling Azure Function v1 (.NET Framework) gives FileNotFoundException for Microsoft.Azure.WebJobs

  15. 15

    コンソールアプリでのOneDriveSDK認証の問題

  16. 16

    iOS OneDriveSDK-非推奨のUIWebViewの更新が必要

  17. 17

    実行時に変数V1に含まれる変数V2を更新するにはどうすればよいですか?

  18. 18

    v1をv2に変換するAzure関数DotNetStandard'AzureWebJobsServiceBus 'がないか、空です

  19. 19

    koa v1 から v2 への移行

  20. 20

    指定されたIDで2列v1とv2の平均と標準偏差をとる関数を書く方法はありますか?

  21. 21

    Login with personal Microsoft accounts failes to Oauth2 v2

  22. 22

    Microsoft Office設定を移行するにはどうすればよいですか?

  23. 23

    AzureADのバージョンがV1かV2かを確認するにはどうすればよいですか?

  24. 24

    STLなしでC ++でedge(v1、v2)リストを作成するにはどうすればよいですか?

  25. 25

    Microsoft.Office365.Discovery-CapabilityDiscoveryResult-> Office 365 V2 DLLを使用した後、ServiceEndpointUriのURiが間違っています

  26. 26

    React-trancition-group。.v1から.v2への移行後の移行は機能しません

  27. 27

    Microsoftロゴアニメーションv2

  28. 28

    「V2」ストレージアカウントを「V1」にダウングレードすることは可能ですか?

  29. 29

    Azure Function v2は、Microsoft.NET.Sdk.Functionsよりも新しいバージョンのNewtonsoft.Jsonを持つプロジェクトを参照します

ホットタグ

アーカイブ