/// <summary> /// Sets the access tokens /// </summary> /// <param name="tokensString">A JSON string with token data</param> /// <returns></returns> public async static Task ParseResponseToTokens(string tokensString, SecurityFlow securityFlow) { JsonObject tokensJson = new JsonObject(); try { tokensJson = JsonObject.Parse(tokensString); } catch (COMException) { } if (tokensJson.TryGetValue("access_token", out IJsonValue accessTokenJson) && accessTokenJson.ValueType == JsonValueType.String) { if (securityFlow == SecurityFlow.AuthorizationCode) { accessToken = accessTokenJson.GetString(); } else if (securityFlow == SecurityFlow.ClientCredentials) { ccAccessToken = accessTokenJson.GetString(); } } if (tokensJson.TryGetValue("expires_in", out IJsonValue expiresInJson) && expiresInJson.ValueType == JsonValueType.Number) { double expiresIn = expiresInJson.GetNumber(); DateTime currentTime = DateTime.Now; if (securityFlow == SecurityFlow.AuthorizationCode) { expireTime = currentTime.AddSeconds(expiresIn); } else if (securityFlow == SecurityFlow.ClientCredentials) { ccExpireTime = currentTime.AddSeconds(expiresIn); } } if (tokensJson.TryGetValue("refresh_token", out IJsonValue refreshTokenJson) && refreshTokenJson.ValueType == JsonValueType.String) { refreshToken = refreshTokenJson.GetString(); } if (tokensJson.TryGetValue("expire_time", out IJsonValue expireTimeJson) && expireTimeJson.ValueType == JsonValueType.String) { expireTime = new DateTime(Convert.ToInt64(expireTimeJson.GetString())); } if (tokensJson.TryGetValue("ccAccess_token", out IJsonValue ccAccessTokenJson) && ccAccessTokenJson.ValueType == JsonValueType.String) { ccAccessToken = ccAccessTokenJson.GetString(); } if (tokensJson.TryGetValue("ccExpire_time", out IJsonValue ccExpireTimeJson) && ccExpireTimeJson.ValueType == JsonValueType.String) { ccExpireTime = new DateTime(Convert.ToInt64(ccExpireTimeJson.GetString())); } if (securityFlow == SecurityFlow.AuthorizationCode) { string userJson = await SendAuthGetRequest("https://api.spotify.com/v1/me"); await UserProfile.UpdateInfo(userJson); } }
/// <summary> /// Sends a GET request to the Spotify API with required tokens /// </summary> /// <param name="uriString">The Spotify REST endpoint to hit</param> /// <returns>The response body</returns> public async static Task <string> SendGetRequest(string uriString, string token, SecurityFlow securityFlow) { if (securityFlow == SecurityFlow.AuthorizationCode) { if (DateTime.Now.Ticks > expireTime.Ticks || accessToken == "") { await RefreshTokens(); token = accessToken; } } else if (securityFlow == SecurityFlow.ClientCredentials) { if (DateTime.Now.Ticks > ccExpireTime.Ticks || ccAccessToken == "") { await GetClientCredentialsTokens(); token = ccAccessToken; } } // Create an HTTP client object HttpClient client = new HttpClient(); //Add authorization header to the GET request. client.DefaultRequestHeaders.Authorization = new HttpCredentialsHeaderValue("Bearer", token); client.DefaultRequestHeaders.Accept.Add(new HttpMediaTypeWithQualityHeaderValue("application/json")); UriBuilder uri = new UriBuilder(uriString); HttpResponseMessage httpResponse = new HttpResponseMessage(); string httpResponseBody = ""; try { httpResponse = await client.GetAsync(uri.Uri); httpResponse.EnsureSuccessStatusCode(); httpResponseBody = await httpResponse.Content.ReadAsStringAsync(); } catch (Exception ex) { string extraInfo = ""; if (ex.Message.StartsWith("Bad Request")) { extraInfo = "\nEnsure Spotify clienId and clientSecret are correct."; } MainPage.errorMessage = String.Format("Error with REST endpoint {0}: {1}{2}", tokenBase, ex.Message.Replace(Environment.NewLine, ""), extraInfo); httpResponseBody = "Error: " + ex.HResult.ToString("X") + " Message: " + ex.Message; } return(httpResponseBody); }