public async Task <ActionResult> AuthorizeUserCallback(string code, string error, string state) { try { if (!string.IsNullOrEmpty(error)) { return(Result(StatusCodes.Status401Unauthorized, $"Error: {error}, State: {state ?? "NULL"}")); } if (string.IsNullOrWhiteSpace(code)) { return(Result(StatusCodes.Status400BadRequest, "Error: Empty or null code returned, " + $"State: {state ?? "NULL"}")); } var tokenRequest = new AuthorizationCodeTokenRequest { ClientId = UserAuth.ClientId, ClientSecret = UserAuth.ClientSecret, Code = code, Address = Constants.UrlSpotifyToken, RedirectUri = UserAuth.BaseUrl + Constants.LocalUrlAuthCallback }; var tokenRequestTime = DateTimeOffset.UtcNow; var tokenResponse = await HttpClient.RequestAuthorizationCodeTokenAsync(tokenRequest); if (tokenResponse.IsError) { throw new ApplicationException("Failed to get token authorization code token." + Environment.NewLine + $"{tokenResponse.ErrorType} Error:" + $"{tokenResponse.Error} {tokenResponse.ErrorDescription}"); } // ReSharper disable once InconsistentNaming var Expiry = tokenRequestTime + TimeSpan.FromSeconds(tokenResponse.ExpiresIn); var keysToStore = new Dictionary <string, string> { { nameof(tokenResponse.AccessToken), tokenResponse.AccessToken }, { nameof(tokenResponse.RefreshToken), tokenResponse.RefreshToken }, { nameof(Expiry), Expiry.ToString(CultureInfo.InvariantCulture) } }; PersistenceHelper.StoreKeys(keysToStore); return(Success()); } catch (Exception ex) { return(Result(ex)); } }