using System;
using System.Threading.Tasks;
namespace SpotifyAPI.Web.Http
{
///
/// This Authenticator requests new credentials token on demand and stores them into memory.
/// It is unable to query user specifc details.
///
public class AuthorizationCodeAuthenticator : IAuthenticator
{
public event EventHandler? TokenRefreshed;
///
/// Initiate a new instance. The token will be refreshed once it expires.
/// The initialToken will be updated with the new values on refresh!
///
public AuthorizationCodeAuthenticator(string clientId, string clientSecret, AuthorizationCodeTokenResponse initialToken)
{
Ensure.ArgumentNotNull(clientId, nameof(clientId));
Ensure.ArgumentNotNull(clientSecret, nameof(clientSecret));
Ensure.ArgumentNotNull(initialToken, nameof(initialToken));
InitialToken = initialToken;
ClientId = clientId;
ClientSecret = clientSecret;
}
///
/// The ClientID, defined in a spotify application in your Spotify Developer Dashboard
///
public string ClientId { get; }
///
/// The ClientID, defined in a spotify application in your Spotify Developer Dashboard
///
public string ClientSecret { get; }
///
/// The inital token passed to the authenticator. Fields will be updated on refresh.
///
///
public AuthorizationCodeTokenResponse InitialToken { get; }
public async Task Apply(IRequest request, IAPIConnector apiConnector)
{
Ensure.ArgumentNotNull(request, nameof(request));
if (InitialToken.IsExpired)
{
var tokenRequest = new AuthorizationCodeRefreshRequest(ClientId, ClientSecret, InitialToken.RefreshToken);
var refreshedToken = await OAuthClient.RequestToken(tokenRequest, apiConnector).ConfigureAwait(false);
InitialToken.AccessToken = refreshedToken.AccessToken;
InitialToken.CreatedAt = refreshedToken.CreatedAt;
InitialToken.ExpiresIn = refreshedToken.ExpiresIn;
InitialToken.Scope = refreshedToken.Scope;
InitialToken.TokenType = refreshedToken.TokenType;
TokenRefreshed?.Invoke(this, InitialToken);
}
request.Headers["Authorization"] = $"{InitialToken.TokenType} {InitialToken.AccessToken}";
}
}
}