public ActionResult oauth2callback(GoogleResult result)
        {
            try
            {
                if (!string.IsNullOrEmpty(result.error))
                {
                    return(View("Index", new LoginData()
                    {
                        IsError = true, Error = string.Format("Error occured ({0}). Try again later.", result.error), redirectInfo = result.state
                    }));
                }

                HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("https://accounts.google.com/o/oauth2/token");
                request.Method      = "POST";
                request.ContentType = "application/x-www-form-urlencoded";
                using (TextWriter tw = new StreamWriter(request.GetRequestStream()))
                {
                    tw.Write(string.Format("code={0}&client_id={1}&client_secret={2}&redirect_uri={3}&grant_type={4}",
                                           result.code, GlobalUtils.TopSecret.Google_client_id, GlobalUtils.TopSecret.Google_client_secret, GlobalUtils.TopSecret.Google_callback_url, "authorization_code"));
                }
                string json = null;
                using (TextReader tr = new StreamReader(request.GetResponse().GetResponseStream()))
                {
                    json = tr.ReadToEnd();
                }

                JavaScriptSerializer        js  = new JavaScriptSerializer();
                Dictionary <string, object> res = (Dictionary <string, object>)js.Deserialize(json, typeof(Dictionary <string, object>));

                GoogleResult gr = new GoogleResult()
                {
                    access_token = (string)res["access_token"],
                    id_token     = (string)res["id_token"],
                    expires_in   = (int)res["expires_in"],
                    token_type   = (string)res["token_type"]
                };

                request        = (HttpWebRequest)HttpWebRequest.Create(string.Format("https://www.googleapis.com/oauth2/v1/userinfo?access_token={0}", gr.access_token));
                request.Method = "GET";
                using (TextReader tr = new StreamReader(request.GetResponse().GetResponseStream()))
                {
                    json = tr.ReadToEnd();
                }
                res      = (Dictionary <string, object>)js.Deserialize(json, typeof(Dictionary <string, object>));
                gr.email = (string)res["email"];

                var hash = Utils.EncryptionUtils.CreateMD5Hash(gr.email);
                var name = Model.IsGoogleAccountCreated(hash);

                if (!string.IsNullOrEmpty(name))
                {
                    SessionManager.SetAuthentication(name);
                    if (!string.IsNullOrEmpty(result.state))
                    {
                        return(this.Redirect(Utils.Utils.BaseUrl + result.state));
                    }
                    else
                    {
                        return(this.RedirectToAction("UsersStuff"));
                    }
                }
                else
                {
                    return(View("CreateGoogleUser", new GoogleUser()
                    {
                        EmailHash = hash, redirectInfo = result.state
                    }));
                }
            }
            catch (Exception e)
            {
                Utils.Log.LogInfo(null, e, "google login error");
                return(View("Index", new LoginData()
                {
                    IsError = true, Error = "Error occured. Try again later.", redirectInfo = result.state
                }));
            }
        }
        public ActionResult oauth2callback_facebook(GoogleResult result)
        {
            try
            {
                if (!string.IsNullOrEmpty(result.error))
                {
                    return View("Index", new LoginData() { IsError = true, Error = string.Format("Error occured ({0}). Try again later.", result.error), redirectInfo = result.state });
                }

                HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("https://graph.facebook.com/v2.8/oauth/access_token");
                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded";
                using (TextWriter tw = new StreamWriter(request.GetRequestStream()))
                {
                    tw.Write(string.Format("code={0}&client_id={1}&client_secret={2}&redirect_uri={3}",
                             result.code, GlobalUtils.TopSecret.Facebook_client_id, GlobalUtils.TopSecret.Facebook_client_secret, GlobalUtils.TopSecret.Facebook_callback_url));
                }
                string json = null;
                using (TextReader tr = new StreamReader(request.GetResponse().GetResponseStream()))
                {
                    json = tr.ReadToEnd();
                }

                JavaScriptSerializer js = new JavaScriptSerializer();
                Dictionary<string, object> res = (Dictionary<string, object>)js.Deserialize(json, typeof(Dictionary<string, object>));

                GoogleResult gr = new GoogleResult()
                {
                    access_token = (string)res["access_token"],
                    //id_token = (string)res["id_token"],
                    expires_in = (int)res["expires_in"],
                    token_type = (string)res["token_type"]
                };

                request = (HttpWebRequest)HttpWebRequest.Create(string.Format("https://graph.facebook.com/debug_token?access_token={0}|{1}&input_token={2}", GlobalUtils.TopSecret.Facebook_client_id, GlobalUtils.TopSecret.Facebook_client_secret, gr.access_token));
                request.Method = "GET";
                using (TextReader tr = new StreamReader(request.GetResponse().GetResponseStream()))
                {
                    json = tr.ReadToEnd();
                }
                var nres = (Dictionary<string, Dictionary<string, object>>)js.Deserialize(json, typeof(Dictionary<string, Dictionary<string, object>>));

                var facebook_user_id = (string)nres["data"]["user_id"];

                var hash = "fb_" + Utils.EncryptionUtils.CreateMD5Hash(facebook_user_id);
                var name = Model.IsGoogleAccountCreated(hash);

                if (!string.IsNullOrEmpty(name))
                {
                    SessionManager.SetAuthentication(name);
                    if (!string.IsNullOrEmpty(result.state))
                        return this.Redirect(Utils.Utils.BaseUrl + result.state);
                    else
                        return this.RedirectToAction("UsersStuff");
                }
                else
                {
                    return View("CreateGoogleUser", new GoogleUser() { EmailHash = hash, redirectInfo = result.state });
                }
            }
            catch (Exception e)
            {
                Utils.Log.LogInfo(null, e, "facebook login error");
                return View("Index", new LoginData() { IsError = true, Error = "Error occured. Try again later.", redirectInfo = result.state });
            }
        }