我使用子类Xamarin.Auth WebRedirectAuthenticator
与Microsoft.OneDriveSDK
v2.0.0。
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());
}
一旦我拥有的访问和刷新令牌,我可以实现,需要传递给OneDriveClient
构造在IHttpProvider
:
我使用的是通过建立一个authorizeUrl:
经由Xamarin.Auth
子获得初始access_token
为了设置访问令牌在HTTP头:
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
客户端和IHttpProvider
对象(我只是在构建所有OneDrive API调用的相同类上实现它们),并且每个OnDrive请求都将使用保存的Account
中的访问令牌。
注意:我的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;
}
非常感谢您抽出宝贵时间为了这个全面的答案!同时我注意到,在我注册OneDrive应用程序的区域中,现在可以定义Microsoft Graph权限,如委派和应用程序凭证。我相信这也必须设置。此外,其中的说明声明V2 Auth端点是Azure AD或Microsoft Live。我目前仅对Microsoft Live进行身份验证,因此MS Graph的主要优势已消失。 – eX0du5
我只使用一个Live acct来抵御oauth2,我希望有一种方法不像C#OneDrive SDK那样使用Graph,就像你可以用他们的Android版本一样。但跳过使用它登录,只实现两个接口工作正常。幸运的是,xamarin链接器去掉了所有未使用的Graph代码,并且应用程序的大小是可管理的 – SushiHangover