GoogleWebAuthorizationBroker.AuthorizeAsync работает локально, но зависает на производственном IIS

У меня есть приложение для отчетов, которое использует API AdSense. Я использую GoogleWebAuthorizationBroker.AuthorizeAsync для аутентификации. Когда я запускаю его локально, он работает нормально, открывается окно запроса на разрешение, и после того, как я предоставляю доступ, все работает. Моя проблема заключается в том, что при развертывании его на производственном сервере, и он работает на IIS, GoogleWebAuthorizationBroker.AuthorizeAsync зависает навсегда. Я предполагаю, что он пытается открыть окно авторизации на сервере и не может этого сделать. Я не писал эту реализацию, и она некоторое время была в производстве, и она работала нормально. Я не уверен, что случилось, и если что-то изменилось, но сейчас это не работает. Я занимался серфингом и пробовал разные подходы, но никто не работал. Когда я попытался использовать GoogleAuthorizationCodeFlow с AccessType, установленным в "автономный режим" и с предоставленным URI, он все еще не работал. Я также пытался использовать служебную учетную запись, но позже узнал, что они не поддерживаются для AdSense. Ниже приведен пример кода

    var credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                new ClientSecrets
                {
                    ClientId = ConfigurationManager.AppSettings["AdSenseClientId"],
                    ClientSecret = ConfigurationManager.AppSettings["AdSenseClientSecret"]
                },
                new string[] { AdSenseService.Scope.Adsense },
                "xxxxxxxx@gmail.com",
                CancellationToken.None).Result;
            // Create the service.
            adSenseService = new AdSenseService(new BaseClientService.Initializer
            {
                HttpClientInitializer = credential,
                ApplicationName = "My API Project"
            });
    var adClientRequest = adSenseService.Adclients.List();
        var adClientResponse = adClientRequest.Execute();

Я был бы очень полезен для примера кода, который решает это. Я видел этот пост ( ASP.NET MVC5 Google APIs GoogleWebAuthorizationBroker.AuthorizeAsync работает локально, но не развернут в IIS), но в нем нет примера кода, и он мне не помог.

Заранее спасибо.

1 ответ

Мы потратили несколько дней, пытаясь выяснить, почему этот метод зависает в IIS и отлично работает в Visual Studio Dev Server. В конце концов мы использовали другой метод, который, кажется, делает эту работу, надеюсь, это сэкономит вам время.

Следующий код возвращает все загруженные видео:

using Google.Apis.Auth.OAuth2.Flows;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Util.Store;
using Google.Apis.YouTube.v3;
using Google.Apis.Auth.OAuth2.Web;
using Google.Apis.Services;
using Google.Apis.YouTube.v3.Data;
using System.Threading;

private void GetData()
{
    IAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow(
        new GoogleAuthorizationCodeFlow.Initializer
        {
            ClientSecrets = new ClientSecrets { ClientId = "[ClientID]", ClientSecret = "[ClientSecret]" },
            DataStore = new FileDataStore("C:\\Temp", true),
            Scopes = new[] { YouTubeService.Scope.YoutubeReadonly }
        });
    var userId = "[ACCOUNTNAME]";
    var uri = Request.Url.ToString();
    var code = Request["code"];
    if (code != null)
    {
        var token = flow.ExchangeCodeForTokenAsync(userId, code, uri.Substring(0, uri.IndexOf("?")), CancellationToken.None).Result;

        // Extract the right state.
        var oauthState = AuthWebUtility.ExtracRedirectFromState(flow.DataStore, userId, Request["state"]).Result;
        Response.Redirect(oauthState);
    }
    else
    {
        var result = new AuthorizationCodeWebApp(flow, uri, uri).AuthorizeAsync(userId, CancellationToken.None).Result;

        if (result.RedirectUri != null)
        {
            // Redirect the user to the authorization server.
            Response.Redirect(result.RedirectUri);
        }
        else
        {
            // The data store contains the user credential, so the user has been already authenticated.
            var youtubeService = new YouTubeService(new BaseClientService.Initializer
            {
                ApplicationName = "MyVideoApp",
                HttpClientInitializer = result.Credential
            });

            if (youtubeService != null)
            {
                var channelsListRequest = youtubeService.Channels.List("contentDetails");
                channelsListRequest.Mine = true;
                ChannelListResponse channelsListResponse = channelsListRequest.ExecuteAsync().Result;
                foreach (var channel in channelsListResponse.Items)
                {
                    var playlistItemsListRequest = youtubeService.PlaylistItems.List("snippet, status");
                    playlistItemsListRequest.PlaylistId = channel.ContentDetails.RelatedPlaylists.Uploads;
                    var playlistItemsListResponse = playlistItemsListRequest.ExecuteAsync().Result;
                }
            }
        }
    }
}

Код предложит вам войти в Google, но после входа вы должны сначала получить ошибку перенаправления. Вам нужно будет настроить URL-адреса перенаправления для вашего проекта по адресу http://console.developers.google.com/.

Параметр перенаправления URL-адресов находится в разделе "APIs" и "Auth > Credentials". Вам нужно нажать кнопку "Изменить настройки" и указать следующие URI авторизованного перенаправления, адаптированные для вашего имени домена и номера порта:

http://localhost:1234/Default.aspx http://localhost:1234/Options.aspx

Другие вопросы по тегам