Почему вызов API Google Диска из .NET Core 3.1 не прошел проверку подлинности?

#c# #asp.net-core #google-api #google-drive-api #google-api-dotnet-client

#c# #asp.net-core #google-api #google-drive-api #google-api-dotnet-client

Вопрос:

У нас есть проект .NET Core 3.1, в котором мы хотим совершать вызовы для получения информации о Google Диске с нашего Google Диска.

Используя этот проект в качестве основы

https://github.com/googleapis/google-api-dotnet-client/tree/master/Src/Support/Google.Apis.Auth .AspNetCore3.Тесты интеграции

в нашем проекте реализовано следующее:

Создал проект и получил client_id и secret в нашей учетной записи Google.

Включает Google.Apis.Auth.AspNetCore3 и Google.Apis.Пакеты Drive.v3

   <ItemGroup>
    <PackageReference Include="Dapper" Version="2.0.78" />
    <PackageReference Include="Google.Apis.Auth.AspNetCore3" Version="1.49.0" />
    <PackageReference Include="Google.Apis.Drive.v3" Version="1.49.0.2194" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.11" />
    <PackageReference Include="Microsoft.Extensions.Options" Version="3.1.11" />
    <PackageReference Include="SendGrid" Version="9.22.0" />
    <PackageReference Include="StringTemplate4" Version="4.0.8" />
    <PackageReference Include="System.Data.SqlClient" Version="4.8.2" />
  </ItemGroup>
 

Затем в Startup.cs есть следующее для интеграции с API Google Диска

 public void ConfigureServices(IServiceCollection services)
{

 ...

  // This configures Google.Apis.Auth.AspNetCore3 for use in this app.
  services
      .AddAuthentication(o =>
      {
        // This forces challenge results to be handled by Google OpenID Handler, so there's no
        // need to add an AccountController that emits challenges for Login.
        o.DefaultChallengeScheme = GoogleOpenIdConnectDefaults.AuthenticationScheme;
        // This forces forbid results to be handled by Google OpenID Handler, which checks if
        // extra scopes are required and does automatic incremental auth.
        o.DefaultForbidScheme = GoogleOpenIdConnectDefaults.AuthenticationScheme;
        // Default scheme that will handle everything else.
        // Once a user is authenticated, the OAuth2 token info is stored in cookies.
        o.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
      })
      .AddCookie()
      .AddGoogleOpenIdConnect(options =>
      {
        options.ClientId = "<client_id";
        options.ClientSecret = "<secret>";
      });

 ...

}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{

 ...

  // Google API initialization
  app.UseAuthentication();
  app.UseAuthorization();

 ...
}
 

Затем контроллер имеет следующий метод для вызова API Google Диска

 [GoogleScopedAuthorize(DriveService.ScopeConstants.DriveReadonly)]
public async Task<List<GDFolder>> GetRoot([FromServices] IGoogleAuthProvider auth)
{
  try
  {
    GoogleCredential cred = await auth.GetCredentialAsync();
    var service = new DriveService(new BaseClientService.Initializer
    {
      HttpClientInitializer = cred
    });
    var fileListRequest = service.Files.List();
    fileListRequest.Fields = "nextPageToken, files(id, name, mimeType, modifiedTime)";
    fileListRequest.PageSize = 25;
    fileListRequest.Q = $"'{ROOT_ID}' in parents and mimeType='{GDMIMETypeString.FOLDER}'{QUERY_EXCLUDETRASH}";

    var gdFiles = await fileListRequest.ExecuteAsync();


    return gdFiles;

  }
  catch (Exception exc)
  {
    throw new ApplicationException("Unable to get list of Google Drive files", exc);
  }

}
 

Когда строка GoogleCredential cred = ожидает авторизации.GetCredentialAsync(); выполняется исключение со следующей ошибкой.

«Невозможно получить учетные данные, если они не аутентифицированы».

Что может быть неправильным в нашей реализации, чтобы вызвать эту ошибку аутентификации?

Комментарии:

1. Вы правильно создали учетные данные для веб-авторизации? Он появляется и запрашивает авторизацию?

2. Да, были созданы учетные данные для веб-авторизации. Запрос на аутентификацию не отображается.

3. Хорошо, это странно. Я попытаюсь запустить ваш код утром и свяжусь с вами.

4. Вы пытались заставить quick start работать как отдельный проект? developers.google.com/drive/api/v3/quickstart/dotnet — просто чтобы убедиться, что это возможно на любой платформе, которую вы используете, и что ваш проект настроен правильно.

5. Проект быстрого запуска работает. Однако мы создаем API, в котором не будет пользователя для подтверждения доступа. Кроме того, API будет находиться в службе приложений Azure.