Google Fotos Library API-Aktualisierungstoken ASP.NET Core MVCC#

Ein Treffpunkt für C#-Programmierer
Guest
 Google Fotos Library API-Aktualisierungstoken ASP.NET Core MVC

Post by Guest »

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:

    Code: Select all

    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);
    
    HttpContext.Session.SetString("AccessToken", tokenResponse.AccessToken);
    
    return RedirectToAction("Index", "Home");
    }
    
  • 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: Select all

    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);
    }
    

    Code: Select all

    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

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post