我有一个新的Blazor应用程序,我正在尝试将其拼接在一起,我想读出我最近所有的Google驱动器文件。调用auth代码流,获取响应(包括代码)等等都是正常的。我有正确的重定向URI批准列表,但是调用flow.ExchangeCodeForTokenAsync
总是失败,并带有一个响应属性,表明该调用处于故障状态。
最初调用我的“登录”页面时,代码将按预期的方向进行重定向,并在URL中包含适当的状态和代码字符串。但是,当我的页面看到Google响应代码并落入if / then条件的第二部分时,任务总是失败,token.IsFaulted
始终为true,并且WASM显示异常:“ WASM:[System.AggregateException]发生一个或多个错误。(无法调用方法,因为它已被擦除。”
我真的可以在这里朝正确的方向轻推。
@using Google.Apis.Drive.v3
@using Google.Apis.Auth.OAuth2
@using Google.Apis.Auth.OAuth2.Flows
@using Google.Apis.Auth.OAuth2.Responses
@using Google.Apis.Auth.OAuth2.Web
@using Google.Apis.Services
@using Google.Apis.Util.Store
@using System.IO
@using System.Threading
@page "/signin"
@inject HttpClient Http
@inject Microsoft.AspNetCore.Blazor.Services.IUriHelper UriHelper
@functions {
private GoogleAuthorizationCodeFlow flow;
private string[] _scopes = new string[]
{
DriveService.Scope.Drive,
DriveService.Scope.DriveReadonly,
DriveService.Scope.DriveMetadataReadonly,
DriveService.Scope.DriveAppdata,
DriveService.Scope.DriveFile
};
ClientSecrets secrets = new ClientSecrets()
{
ClientId = "a-very-long-string",
ClientSecret = "a-slightly-shorter-string"
};
protected override async Task OnInitAsync()
{
flow = new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer(){
DataStore = new FileDataStore("My.Education.Store", false),
ClientSecrets = secrets,
Scopes = _scopes
});
Uri uri = new Uri(UriHelper.GetAbsoluteUri());
string code = uri.Query.IndexOf("code") > 0 ? uri.QueryParam()["code"] : String.Empty; // QueryParam is just an extension method
if (String.IsNullOrEmpty(code))
{
AuthorizationCodeWebApp.AuthResult result = (new AuthorizationCodeWebApp(flow, $"{uri.Scheme}://{uri.Host}:{uri.Port}/signin", uri.ToString())).AuthorizeAsync("me", CancellationToken.None).Result;
Console.WriteLine($"Redirecting to {result.RedirectUri}");
//UriHelper.NavigateTo(result.RedirectUri);
}
else
{
var token = flow.ExchangeCodeForTokenAsync("me", code, "http://locahost:5000", CancellationToken.None);
Console.WriteLine(token.IsCompleted);
Console.WriteLine($"Faulted: {token.IsFaulted}"); // always true
}
}
}
答案 0 :(得分:0)
从未使用过Google云端硬盘,因此不确定它是什么。但是,如果您希望访问Blazor之外的外部Web代理,则可以使用JSInterop(不推荐)或HttpClient。请记住,Blazor是一个客户端应用程序。我相信HttpClient可以解决您的问题。 HttpClientJsonExtensions定义了几种方法,其中一种可能符合您的要求。
希望这对您有帮助...