gpt4 book ai didi

c# - 如何将 Microsoft.OneDriveSDK v1 迁移到 v2?

转载 作者:行者123 更新时间:2023-11-30 21:45:51 25 4
gpt4 key购买 nike

我有一个基于 Xamarin 的应用程序,它使用版本为 1.x 的 Microsoft.OneDriveSDK nuget 包。在这个应用程序中,我使用 Xamarin.Auth 管理 OAuth 内容,从而从该框架获取 access_token。

使用 OneDriveSDK 1.x,我可以通过重新定义几个类来提供此访问 token ,然后再也不会让 API 尝试获取 token 。

现在我想迁移到版本 2,并注意到以前的类已被替换,API 现在改用 Microsoft.Graph nuget 包。所以我必须实现接口(interface) 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);
}
}

代码被调用并正确地向请求 header 提供身份验证 token 。但是一旦 SDK 尝试使用 token ,我就会得到一个异常:

Exception of type 'Microsoft.Graph.ServiceException' was thrown.

Code: InvalidAuthenticationToken

Message: CompactToken parsing failed with error code: -2147184118

现在使用谷歌搜索此消息总是说该 token 不符合 JWT 标准,然后 SDK 会将其用作 Microsoft 实时帐户 token 。但如果是这种情况,我想知道为什么它在 V2 上失败但在 V1 上有效。

身份验证针对:

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

非常感谢任何帮助!

最佳答案

我将子类 Xamarin.Auth WebRedirectAuthenticatorMicrosoft.OneDriveSDK v2.0.0 一起使用。

我使用 authorizeUrl: 通过 Xamarin.Auth 子类获取初始 access_token ,该子类通过以下方式构建:

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

获得访问和刷新 token 后,我可以实现需要传递给 OneDriveClient 构造函数的 IHttpProvider,以便在 http header 中设置访问 token :

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

使用您的 IAuthenticationProviderIHttpProvider 对象创建您的 OneDriveClient 客户端(我只是在构建所有 OneDrive 的同一个类上实现它们API 调用),并且每个 OnDrive 请求都将使用您保存的 Account 中的访问 token 。

注意:我的 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);

刷新几乎一样简单,我存储访问 token 何时过期(减去 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;
}

关于c# - 如何将 Microsoft.OneDriveSDK v1 迁移到 v2?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39808616/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com