コード例 #1
0
        public bool AuthenticateForSignUp(System.Web.HttpContext context, out Me me, out string accessToken)
        {
            me = null;
            accessToken = "";
            string code = context.Request.QueryString["code"];
            string url;
            WebClient webClient = new WebClient();

            // If this is a return of a Facebook result then check is an error has orrured
            string log = "";
            if (context.Request.QueryString["error_reason"] != null) log += "error_reason" + context.Request.QueryString["error_reason"] + ";";
            if (context.Request.QueryString["error"] != null) log += "error" + context.Request.QueryString["error"] + ";";
            if (context.Request.QueryString["error_description"] != null) log += "error_description" + context.Request.QueryString["error_description"] + ";";
            if (!String.IsNullOrEmpty(log))
            {
                Exception exception = new Exception(log);
                Logger.Instance.Write(LogLevel.Error, exception, log);
                throw exception;
            }

            // No code given means initialize Facebook authentication. Redirect this page to Facebook with neccesery parameters
            if (String.IsNullOrEmpty(code))
            {
                url = FACEBOOK_OAUTH_DIALOG;
                url += "?client_id=" + ConfigurationManager.AppSettings["Facebook.App.Id"];  //GetConfiguration("facebook.app_id");
                url += "&redirect_uri=" + HttpUtility.UrlEncode(context.Request.Url.AbsoluteUri);
                url += "&scope=email,publish_stream,manage_pages";
                url += "&state=" + context.Session.SessionID;
                context.Response.Redirect(url, true);
                //return;
            }

            // When code is given then Facebook authentication went without errors.
            if (context.Session.SessionID == context.Request.QueryString["state"])
            {
                url = FACEBOOK_OAUTH_ACCESS;
                url += "?client_id=" + ConfigurationManager.AppSettings["Facebook.App.Id"];  //GetConfiguration("facebook.app_id");
                url += "&redirect_uri=" + HttpUtility.UrlEncode(context.Request.Url.AbsoluteUri.Replace(context.Request.Url.Query, ""));
                url += "&client_secret=" + ConfigurationManager.AppSettings["Facebook.App.Secret"];  //GetConfiguration("facebook.app_secret");
                url += "&code=" + code;
                string oAuthAccessResult = webClient.DownloadString(url);
                Logger.Instance.Write(LogLevel.Debug, "Facebook authentication result: " + oAuthAccessResult, oAuthAccessResult);

                DateTime expires = DateTime.Now.AddMinutes(1);
                int expiresIndex = oAuthAccessResult.IndexOf("&expires=");
                if (expiresIndex == -1)
                {
                    expiresIndex = oAuthAccessResult.Length;
                }
                else
                {
                    string expiresStr = oAuthAccessResult.Substring(expiresIndex + 9, oAuthAccessResult.Length - expiresIndex - 9);
                    int expiresInSec = int.Parse(expiresStr);
                    expires = DateTime.Now.AddSeconds(expiresInSec);
                }
                accessToken = oAuthAccessResult.Substring(oAuthAccessResult.IndexOf("access_token=") + 13, expiresIndex - 13);

                me = GetMe(accessToken);
                if (me == null)
                {
                    Logger.Instance.Write(LogLevel.Error, "Cannot verify the Facebook account", new object[] { accessToken });
                    throw new Exception("Cannot verify the Facebook account");
                }

                var _client = new FacebookClient(accessToken);
                dynamic _me = _client.Get("me");
                firstName = _me.first_name;
                lastName = _me.last_name;
                email = _me.email;

                using (Database db = new MySqlDatabase())
                {
                    isEmailExist = db.isEmailAlreadyRegistered(email);
                }

                if (string.IsNullOrEmpty(email) || isEmailExist == true)
                    return false;

                //fbAuthentication.Persist(me, accessToken, expires);
            }

            return true;
        }