Ich versuche herauszufinden, ob es eine Möglichkeit gibt, ein Aktualisierungstoken für die Google Fotos Library API zu erhalten. Anscheinend unterstützt die Google Fotos-Bibliothek keine Aktualisierungstoken, da es sich bei den Fotos um Benutzerdaten handelt. Ich bin jedoch der Meinung, dass es eine Möglichkeit geben muss, damit es funktioniert.
Derzeit erteile ich die Autorisierung Über die OAuth-2-URL erhalte ich dann ein Zugriffstoken, mit dem schließlich die API aufgerufen wird, die die Fotos im JSON-Format zurückgibt. Aber irgendwann läuft das Zugriffstoken ab und dann muss ich dem Authentifizierungsablauf erneut folgen. Ich habe auch die Dienstkontoroute ausprobiert, aber es scheint das gleiche Problem zu sein wie bei den Aktualisierungstokens – ein Dienstkonto kann nicht verwendet werden, da die Fotobibliothek dies nicht unterstützt.
Mein Code sieht so aus:
Erstellen einer Autorisierungs-URL, die so aussieht: https://accounts.google.com/o/oauth2/v2 ... client_id=\[CLIENT_ID\]&redirect_uri=\[REDIRECT_URI\]&scope=\[PhotosLibraryService.Scope.PhotoslibraryReadonly \]&login_hint=\[EMAIL\]
Ich glaube, das ist mein erstes Problem. Ich möchte nicht, dass sich jeder Benutzer über die Website autorisiert. Dies muss im Backend geschehen, womit ich Probleme habe
Es wird dann zu meiner Rückruf-URL weitergeleitet:
Home/Callback mit dem Autorisierungszugriff Code, den ich in der Sitzung und in der Datenbank speichere:
var accessToken = HttpContext.Session.GetString("AccessToken");
if (!string.IsNullOrEmpty(accessToken))
{
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://photoslibrary.googleapis.com/v1/mediaItems:search?pageSize=100");
request.Headers.Add("Authorization", "Bearer " + accessToken);
var content = new StringContent("", null, "text/plain");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
responseString = await response.Content.ReadAsStringAsync();
//saves the Json String in the database to be fecthed later
_lookupTableModelService.InsertLookupTable("GooglePhotosJson", responseString);
}
var responseJson = JsonDocument.Parse(responseString);
var photoDetails = new List();
if (responseJson.RootElement.TryGetProperty("mediaItems", out var mediaItems))
{
foreach (var item in mediaItems.EnumerateArray())
{
if (item.TryGetProperty("baseUrl", out var baseUrl) &&
item.TryGetProperty("mediaMetadata", out var mediaMetadata) &&
mediaMetadata.TryGetProperty("width", out var width) &&
mediaMetadata.TryGetProperty("height", out var height))
{
photoDetails.Add(new Dictionary
{
{ "baseUrl", baseUrl.GetString() },
{ "width", width.GetString() },
{ "height", height.GetString() }
});
}
}
}
ViewBag.PhotoDetails = photoDetails;
Dann verwende ich im Grunde einfach die PhotoDetails in meiner Index.cshtml
Ich versuche herauszufinden, ob es eine Möglichkeit gibt, ein Aktualisierungstoken für die Google Fotos Library API zu erhalten. Anscheinend unterstützt die Google Fotos-Bibliothek keine Aktualisierungstoken, da es sich bei den Fotos um Benutzerdaten handelt. Ich bin jedoch der Meinung, dass es eine Möglichkeit geben muss, damit es funktioniert. Derzeit erteile ich die Autorisierung Über die OAuth-2-URL erhalte ich dann ein Zugriffstoken, mit dem schließlich die API aufgerufen wird, die die Fotos im JSON-Format zurückgibt. Aber irgendwann läuft das Zugriffstoken ab und dann muss ich dem Authentifizierungsablauf erneut folgen. Ich habe auch die Dienstkontoroute ausprobiert, aber es scheint das gleiche Problem zu sein wie bei den Aktualisierungstokens – ein Dienstkonto kann nicht verwendet werden, da die Fotobibliothek dies nicht unterstützt. Mein Code sieht so aus: [list] [*]Erstellen einer Autorisierungs-URL, die so aussieht: https://accounts.google.com/o/oauth2/v2/auth?access_type=offline&response_type=code&client_id=\[CLIENT_ID\]&redirect_uri=\[REDIRECT_URI\]&scope=\[PhotosLibraryService.Scope.PhotoslibraryReadonly \]&login_hint=\[EMAIL\] [list] Ich glaube, das ist mein erstes Problem. Ich möchte nicht, dass sich jeder Benutzer über die Website autorisiert. Dies muss im Backend geschehen, womit ich Probleme habe [/list]
[*]Es wird dann zu meiner Rückruf-URL weitergeleitet:
Home/Callback mit dem Autorisierungszugriff Code, den ich in der Sitzung und in der Datenbank speichere: [code]public async Task Callback(string code, string error) { if (!string.IsNullOrEmpty(error)) { return Content($"Error: {error}"); }
if (string.IsNullOrEmpty(code)) { return Content("Authorization code not received."); }
var tokenResponse = await ExchangeCodeForTokenAsync(code);
[*]Und dann kehrt es zu meiner Home/Index-Methode zurück, um mit dem Abrufen der Fotos fortzufahren und sie in einen ViewBag zu legen: [code]var accessToken = HttpContext.Session.GetString("AccessToken");
if (!string.IsNullOrEmpty(accessToken)) { var client = new HttpClient(); var request = new HttpRequestMessage(HttpMethod.Post, "https://photoslibrary.googleapis.com/v1/mediaItems:search?pageSize=100"); request.Headers.Add("Authorization", "Bearer " + accessToken); var content = new StringContent("", null, "text/plain"); request.Content = content; var response = await client.SendAsync(request); response.EnsureSuccessStatusCode();
//saves the Json String in the database to be fecthed later _lookupTableModelService.InsertLookupTable("GooglePhotosJson", responseString); } [/code] [code]var responseJson = JsonDocument.Parse(responseString);
var photoDetails = new List();
if (responseJson.RootElement.TryGetProperty("mediaItems", out var mediaItems)) { foreach (var item in mediaItems.EnumerateArray()) { if (item.TryGetProperty("baseUrl", out var baseUrl) && item.TryGetProperty("mediaMetadata", out var mediaMetadata) && mediaMetadata.TryGetProperty("width", out var width) && mediaMetadata.TryGetProperty("height", out var height)) { photoDetails.Add(new Dictionary { { "baseUrl", baseUrl.GetString() }, { "width", width.GetString() }, { "height", height.GetString() } }); } } }
ViewBag.PhotoDetails = photoDetails; [/code]
[*]Dann verwende ich im Grunde einfach die PhotoDetails in meiner Index.cshtml
Wie serialisiere ich Enum-Felder in String statt in Int in ASP.NET Core 3.0 MVC? Ich schaffe es nicht auf die alte Art und Weise.
services.AddMvc().AddJsonOptions(opts =>
{...
Ich bin bereit, meiner (nativen) Android-App eine Art Google Drive-Synchronisierung hinzuzufügen – ohne Backend (alles geschieht in der App).
Wie in der zu sehen In der Google Identity-Dokumentation...
Ich möchte alle Bilder in einem freigegebenen Google Fotos-Album (oder eine Auswahl davon) von einer C#-App herunterladen können, ohne die Google-Authentifizierung zu verwenden. Dies ist über einen...