Ошибка загрузки API Google Drive после размещения его в IIS. показывает ошибку как Не удалось запустить браузер с - PullRequest
1 голос
/ 04 июля 2019

Я использую внешний вход Google в своем приложении, и мне нужна функция, позволяющая пользователю загружать изображения из приложения на свой диск Google.

В моем локальном коде функция загрузки файлов с диска Google работает нормально, после размещения ее на IIS пользователь не может загрузить изображение.

Я создал файл журнала ошибок. в этом я нашел следующее исключение:

System.AggregateException: произошла одна или несколько ошибок. ---> System.NotSupportedException: не удалось запустить браузер с авторизацией "https://accounts.google.com/o/oauth2/v2/auth?access_type=offline&response_type=code&client_id=347588538121-jeali0jufd389gqsi4ge22ent3939b4m.apps.googleusercontent.com&redirect_uri=http%3A%2F%2Flocalhost%3A60931%2Fauthorize%2F&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive"". Подробности см. Во внутреннем исключении. ---> System.ComponentModel.Win32Exception: доступ запрещен

В redirect_uri я нашел "localhost". но после хостинга это должен быть www.abc.com, и номер порта здесь также всегда меняется.

Пробовал разными способами со stachoverflow и других сайтов. но не нашел решения.

Пожалуйста, помогите мне решить эту проблему.

Спасибо.

Пробовал с

credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
    obj,
    Scopes,
    "user",
    CancellationToken.None,
    new FileDataStore(AppDomain.CurrentDomain.BaseDirectory + "Daimto.GoogleDrive.Auth.Store")
).Result;

, а также с:

using (var stream = new FileStream(Path.Combine(AppDomain.CurrentDomain.BaseDirectory) + "credentials.json", FileMode.Open, FileAccess.Read))
{
    // The file token.json stores the user's access and refresh tokens, and is created
    // automatically when the authorization flow completes for the first time.
    string credPath = AppDomain.CurrentDomain.BaseDirectory + "token.json";
    credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
        GoogleClientSecrets.Load(stream).Secrets,
        Scopes,
        "user",
        CancellationToken.None,
        new FileDataStore(credPath, true)).Result;
}

1 Ответ

2 голосов
/ 04 июля 2019

Вы используете GoogleWebAuthorizationBroker.AuthorizeAsync, который предназначен для использования с установленными приложениями.Он охватывает веб-браузер на компьютере, на котором он работает.Это будет работать нормально, когда вы работаете локально, но не будет работать, когда вы попытаетесь запустить его на сервере, поскольку у вас нет доступа для запуска браузера на сервере (не то, чтобы это помогло, так как пользователь его не увидит)

то, что вы должны использовать, выглядит примерно так

private static readonly IAuthorizationCodeFlow flow =
        new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
            {
                ClientSecrets = new ClientSecrets
                {
                    ClientId = "PUT_CLIENT_ID_HERE",
                    ClientSecret = "PUT_CLIENT_SECRET_HERE"
                },
                Scopes = new[] { DriveService.Scope.Drive },
                DataStore = new FileDataStore("Drive.Api.Auth.Store")
            });

Полный пример можно найти здесь Веб-приложения (ASP.NET MVC)

...