Exemplo n.º 1
0
        /// <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);
            }
        }
Exemplo n.º 2
0
        /// <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);
        }