Почему Google Auth не может вернуть токен? - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть новое приложение Blazor, которое я пытаюсь собрать вместе и хочу прочитать все мои последние файлы с диска Google.Вызов потока кода авторизации, получение ответа (включая код) и т. Д. - все работает нормально.У меня правильный список подтверждения URI перенаправления, но при вызове flow.ExchangeCodeForTokenAsync всегда происходит сбой со свойством ответа о том, что вызов находится в состоянии сбоя.

При первоначальном вызове моей страницы входа код перенаправляется, как и ожидалосьс соответствующим состоянием и строкой кода, включенной в URL.Однако, когда моя страница видит код ответа Google и попадает во вторую часть моего условного условия if / then, Задача всегда завершается неудачей, token.IsFaulted всегда имеет значение true, и WASM показывает исключение: "WASM: [System.AggregateException] One orпроизошло больше ошибок. (Невозможно вызвать метод, потому что он был стерт "

Я действительно мог бы сделать с толчком в правильном направлении здесь.

@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 голосов
/ 31 декабря 2018

Никогда не использовал Google Drive и не уверен, что это такое.Однако, если вы хотите получить доступ к внешнему веб-агенту за пределами Blazor, вы можете использовать JSInterop (не рекомендуется) или HttpClient.Просто помните, Blazor - это клиентское приложение.Я считаю, что HttpClient может решить вашу проблему.HttpClientJsonExtensions определяют пару методов, один из которых может соответствовать вашим требованиям.

Надеюсь, это поможет ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...