Implemented a SpotifyAuthorizationCredential Wrapper class

Hopefully fixes #17 by checking for access token validity before refreshing.
This commit is contained in:
2023-01-28 19:33:00 +01:00
parent 383990d002
commit 2086a85704
3 changed files with 55 additions and 17 deletions

View File

@@ -6,6 +6,7 @@ import de.b00tload.tools.lastfmtospotifyplaylist.arguments.ArgumentHandler;
import de.b00tload.tools.lastfmtospotifyplaylist.arguments.Arguments;
import de.b00tload.tools.lastfmtospotifyplaylist.util.PeriodHelper;
import de.b00tload.tools.lastfmtospotifyplaylist.util.SpotifyCredentials;
import de.b00tload.tools.lastfmtospotifyplaylist.util.TokenHelper;
import de.umass.lastfm.Caller;
import de.umass.lastfm.Track;
@@ -14,7 +15,6 @@ import io.javalin.Javalin;
import io.javalin.http.ContentType;
import io.javalin.http.HttpStatus;
import se.michaelthelin.spotify.SpotifyApi;
import se.michaelthelin.spotify.model_objects.credentials.AuthorizationCodeCredentials;
import se.michaelthelin.spotify.model_objects.specification.Playlist;
import java.net.URI;
@@ -82,12 +82,18 @@ public class LastFMToSpotify {
AtomicBoolean waiting = new AtomicBoolean(true);
if (configuration.containsKey("cache.crypto") && TokenHelper.existsTokens()) {
logLn("Cached credentials have been found.", 2);
logLn("Fetching old credentials, refreshing them and saving to cache", 2);
AuthorizationCodeCredentials oldcred = TokenHelper.fetchTokens();
logLn("Fetching credentials from cache.", 2);
SpotifyCredentials oldcred = TokenHelper.fetchTokens();
api.setRefreshToken(oldcred.getRefreshToken());
AuthorizationCodeCredentials newcred = api.authorizationCodeRefresh().build().execute();
TokenHelper.saveTokens(newcred);
configuration.put("spotify.access", newcred.getAccessToken());
SpotifyCredentials cred;
if(oldcred.isValid()){
cred=oldcred;
} else {
logLn("Cached credentials are invalid due to age. Refreshing and saving to cache", 2);
cred = new SpotifyCredentials(api.authorizationCodeRefresh().build().execute());
TokenHelper.saveTokens(cred);
}
configuration.put("spotify.access", cred.getAccessToken());
} else {
try (Javalin webserver = Javalin.create().start(9876)) {
if (configuration.containsKey("cache.crypto")) logLn("No cached credentials have been found.", 2);
@@ -99,7 +105,7 @@ public class LastFMToSpotify {
webserver.get("/callback/spotify", ctx -> {
if(ctx.queryParamMap().containsKey("code")) {
logLn("Received spotify authentication code. Requesting credentials.", 2);
AuthorizationCodeCredentials cred = api.authorizationCode(ctx.queryParam("code")).setHeader("User-Agent", configuration.get("requests.useragent")).build().execute();
SpotifyCredentials cred = new SpotifyCredentials(api.authorizationCode(ctx.queryParam("code")).setHeader("User-Agent", configuration.get("requests.useragent")).build().execute());
configuration.put("spotify.access", cred.getAccessToken());
if(configuration.containsKey("cache.crypto")) {
logLn("Saving credentials to cache.", 2);

View File

@@ -0,0 +1,34 @@
package de.b00tload.tools.lastfmtospotifyplaylist.util;
import se.michaelthelin.spotify.model_objects.credentials.AuthorizationCodeCredentials;
import java.io.Serializable;
import java.time.Clock;
import java.time.LocalDateTime;
public class SpotifyCredentials implements Serializable {
private final AuthorizationCodeCredentials cred;
private final LocalDateTime validUntil;
public SpotifyCredentials(AuthorizationCodeCredentials cred){
this.cred = cred;
this.validUntil = LocalDateTime.now(Clock.systemDefaultZone()).plusSeconds(cred.getExpiresIn());
}
public String getAccessToken(){
return cred.getAccessToken();
}
public String getRefreshToken(){
return cred.getRefreshToken();
}
public LocalDateTime getValidUntil(){
return validUntil;
}
public boolean isValid(){
return LocalDateTime.now(Clock.systemDefaultZone()).isBefore(validUntil);
}
}

View File

@@ -1,7 +1,5 @@
package de.b00tload.tools.lastfmtospotifyplaylist.util;
import se.michaelthelin.spotify.model_objects.credentials.AuthorizationCodeCredentials;
import java.nio.file.Path;
import static de.b00tload.tools.lastfmtospotifyplaylist.LastFMToSpotify.USER_HOME;
@@ -10,23 +8,23 @@ import static de.b00tload.tools.lastfmtospotifyplaylist.LastFMToSpotify.configur
public class TokenHelper {
/**
* Manages saving a <code>se.michaelthelin.spotify.model_objects.credentials.AuthorizationCodeCredentials</code> into "~/.lfm2s/spotify.lfm2scred" using <code>de.b00tload.tools.lastfmtospotifyplaylist.util.CryptoHelper.serializeEncrypted(...)</code>
* @param cred The <code>se.michaelthelin.spotify.model_objects.credentials.AuthorizationCodeCredentials</code> to be saved
* Manages saving a <codede.b00tload.tools.lastfmtospotifyplaylist.util.SpotifyCredentials</code> into "~/.lfm2s/spotify.lfm2scred" using <code>de.b00tload.tools.lastfmtospotifyplaylist.util.CryptoHelper.serializeEncrypted(...)</code>
* @param cred The <code>de.b00tload.tools.lastfmtospotifyplaylist.util.SpotifyCredentials</code> to be saved
*/
public static void saveTokens(AuthorizationCodeCredentials cred) {
public static void saveTokens(SpotifyCredentials cred) {
CryptoHelper.serializeEncrypted(cred, Path.of(USER_HOME, "/.lfm2s/spotify.lfm2scred"), CryptoHelper.createKeyFromPassword(configuration.get("cache.crypto")));
}
/**
* Manages retrieving a <code>se.michaelthelin.spotify.model_objects.credentials.AuthorizationCodeCredentials</code> from "~/.lfm2s/spotify.lfm2scred" using <code>de.b00tload.tools.lastfmtospotifyplaylist.util.CryptoHelper.deserializeEncrypted(...)</code>
* @return The retrieved <code>se.michaelthelin.spotify.model_objects.credentials.AuthorizationCodeCredentials</code>
* Manages retrieving a <code>de.b00tload.tools.lastfmtospotifyplaylist.util.SpotifyCredentials</code> from "~/.lfm2s/spotify.lfm2scred" using <code>de.b00tload.tools.lastfmtospotifyplaylist.util.CryptoHelper.deserializeEncrypted(...)</code>
* @return The retrieved <code>de.b00tload.tools.lastfmtospotifyplaylist.util.SpotifyCredentials</code>
*/
public static AuthorizationCodeCredentials fetchTokens() {
return (AuthorizationCodeCredentials) CryptoHelper.deserializeEncrypted(Path.of(USER_HOME, "/.lfm2s/spotify.lfm2scred"), CryptoHelper.createKeyFromPassword(configuration.get("cache.crypto")));
public static SpotifyCredentials fetchTokens() {
return (SpotifyCredentials) CryptoHelper.deserializeEncrypted(Path.of(USER_HOME, "/.lfm2s/spotify.lfm2scred"), CryptoHelper.createKeyFromPassword(configuration.get("cache.crypto")));
}
/**
* Checks whether the saved spotify AuthorizationCodeCredentials at "~/.lfm2s/spotify.lfm2scred" exist
* Checks whether the saved SpotifyCredentials at "~/.lfm2s/spotify.lfm2scred" exist
* @return true if file exists, false if not
*/
public static boolean existsTokens(){