private AuthTokenProperties TransformMSGraphTokenResponseIntoAuthProperties(MsGraphGetTokenResponse MSGraphData)
        {
            int expiresIn = -1;

            int.TryParse(MSGraphData.expires_in, out expiresIn);
            return(new AuthTokenProperties(MSGraphData.access_token, expiresIn, MSGraphData.refresh_token, MSGraphData.id_token));
        }
        private async Task <MsGraphGetTokenResponse> ExchangeCodeForAccessTokenPrivate(string code)
        {
            try
            {
                using (HttpClient client = new HttpClient())
                {
                    var postFormParameters = new List <KeyValuePair <string, string> >()
                    {
                        new KeyValuePair <string, string>("client_id", _appId),
                        new KeyValuePair <string, string>("redirect_uri", _redirectUrl),
                        new KeyValuePair <string, string>("code", code),
                        new KeyValuePair <string, string>("grant_type", "authorization_code"),
                        new KeyValuePair <string, string>("scope", string.Join(" ", _scopes))
                    };

                    if (_appSecret != null)
                    {
                        // Secret isn't needed for client apps
                        postFormParameters.Add(new KeyValuePair <string, string>("client_secret", _appSecret));
                    }

                    var formContent = new FormUrlEncodedContent(postFormParameters);
                    client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", TokenRefreshContentType);

                    HttpResponseMessage response = await client.PostAsync(MsGraphTokenRefreshUrl, formContent);

                    string responseString = await response.Content.ReadAsStringAsync();

                    MsGraphGetTokenResponse tokenResponse = JsonConvert.DeserializeObject <MsGraphGetTokenResponse>(responseString);
                    return(tokenResponse);
                }
            }
            catch (Exception ex)
            {
                // Log this??
                throw;
            }
        }
        public async Task <AuthTokenProperties> ExchangeRefreshTokenForAuthInfo(string refreshToken)
        {
            try
            {
                using (HttpClient client = new HttpClient())
                {
                    var postFormParameters = new List <KeyValuePair <string, string> >()
                    {
                        new KeyValuePair <string, string>("client_id", _appId),
                        new KeyValuePair <string, string>("redirect_uri", _redirectUrl),
                        new KeyValuePair <string, string>("refresh_token", refreshToken),
                        new KeyValuePair <string, string>("grant_type", "refresh_token"),
                    };
                    if (_appSecret != null)
                    {
                        postFormParameters.Add(new KeyValuePair <string, string>("client_secret", _appSecret));
                    }

                    var formContent = new FormUrlEncodedContent(postFormParameters);

                    client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", TokenRefreshContentType);

                    var response = await client.PostAsync(MsGraphTokenRefreshUrl, formContent);

                    string responseString = await response.Content.ReadAsStringAsync();

                    MsGraphGetTokenResponse tokenResponse = JsonConvert.DeserializeObject <MsGraphGetTokenResponse>(responseString);
                    return(TransformMSGraphTokenResponseIntoAuthProperties(tokenResponse));
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine("Failed to refresh token! " + ex);
                throw;
            }
        }
        public async Task <AuthTokenProperties> ExchangeCodeForAccessToken(string code)
        {
            MsGraphGetTokenResponse msGraphData = await ExchangeCodeForAccessTokenPrivate(code);

            return(TransformMSGraphTokenResponseIntoAuthProperties(msGraphData));
        }