#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 Диска.
Используя этот проект в качестве основы
в нашем проекте реализовано следующее:
Создал проект и получил 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.