#c# #google-drive-api #cors #google-api-dotnet-client #blazor-webassembly
Вопрос:
Я создал проект веб-сборки Blazor:
В своей консоли Google я создал новый проект веб-приложения, в котором указал Авторизованный источник Javascript и авторизованные URI перенаправления, как показано ниже
В моем проекте Blazor я добавил следующие пакеты:
Google.Api.Auth.AspNetCore3
Google.Api.Привод.v3
Мой стартап.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddRazorPages();
***services
.AddAuthentication(o =>
{
o.DefaultChallengeScheme = GoogleOpenIdConnectDefaults.AuthenticationScheme;
o.DefaultForbidScheme = GoogleOpenIdConnectDefaults.AuthenticationScheme;
o.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie()
.AddGoogleOpenIdConnect(options =>
{
options.ClientId = "{--myclientid--}";
options.ClientSecret = {"--myclientsecret--}";
});***
}
а также
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseWebAssemblyDebugging();
}
else
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseBlazorFrameworkFiles();
app.UseStaticFiles();
app.UseRouting();
***app.UseAuthentication();
app.UseAuthorization();***
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
endpoints.MapControllers();
endpoints.MapFallbackToFile("index.html");
});
}
Я свой WeatherforcastController я добавил этот метод:
[HttpGet("DriveFileList")]
[GoogleScopedAuthorize(DriveService.ScopeConstants.DriveReadonly)]
public async Task<List<String>> DriveFileList([FromServices] IGoogleAuthProvider auth)
{
GoogleCredential cred = await auth.GetCredentialAsync();
var service = new DriveService(new BaseClientService.Initializer
{
HttpClientInitializer = cred
});
var files = await service.Files.List().ExecuteAsync();
var fileNames = files.Files.Select(x => x.Name).ToList();
return fileNames;
}
Я вызываю вышеуказанный метод со своей страницы fetchData.razor, как показано ниже:
protected override async Task OnInitializedAsync()
{
List<String> myFiles = await Http.GetFromJsonAsync<List<String>>("WeatherForecast/DriveFileList");
}
Я бегу и получаю ошибку CORS:
Есть ли обходной путь? Существуют ли другие подходы для доступа к Api Google из веб-сборки Blazor?
Комментарии:
1. Вы намерены сделать это с помощью Blazor на стороне клиента или на стороне сервера?
2. Спасибо. Я надеялся, что это можно сделать на стороне клиента, возможно ли это?
3. Да, но я уверен, что вам нужно будет использовать Google.apis.js клиентская библиотека, а не клиентская библиотека Google .net. Я сделал это еще тогда, когда блейзор только что вышел, работал как заклинание, но я не уверен, что у меня есть какой-либо образец кода, плавающий вокруг.
4. Спасибо, я расследую «Google.apis.js» путь вперед
5. Я еще немного покопался для тебя. #1427 Blazor не поддерживается ни в каком формате клиентской библиотекой Google .net, и команда решила, что это не является приоритетом. #1830