为什么Google的Auth无法返回令牌?

时间:2018-12-31 01:25:18

标签: c# asp.net google-drive-api google-authentication blazor

我有一个新的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

        }

    }

}

1 个答案:

答案 0 :(得分:0)

从未使用过Google云端硬盘,因此不确定它是什么。但是,如果您希望访问Blazor之外的外部Web代理,则可以使用JSInterop(不推荐)或HttpClient。请记住,Blazor是一个客户端应用程序。我相信HttpClient可以解决您的问题。 HttpClientJsonExtensions定义了几种方法,其中一种可能符合您的要求。

希望这对您有帮助...