Example #1
0
        /// <summary>
        /// Creates a Facebook session from a signed request.
        /// </summary>
        /// <param name="appSecret">
        /// The app secret.
        /// </param>
        /// <param name="signedRequest">
        /// The signed request.
        /// </param>
        /// <returns>
        /// The Facebook session.
        /// </returns>
        internal static FacebookSession Create(IFacebookApplication settings, FacebookSignedRequest signedRequest)
        {
            if (settings == null)
            {
                throw new ArgumentNullException("settings");
            }

            if (signedRequest == null)
            {
                return(null);
            }

            var data = (IDictionary <string, object>)signedRequest.Data;

            if (data == null)
            {
                return(null);
            }

            if (!data.ContainsKey("code") && string.IsNullOrEmpty(signedRequest.AccessToken))
            {
                return(null);
            }

            var dictionary = new JsonObject
            {
                { "uid", signedRequest.UserId.ToString() }
            };

            if (!string.IsNullOrEmpty(signedRequest.AccessToken))
            {
                dictionary["access_token"] = signedRequest.AccessToken;
            }

            if (data.ContainsKey("code"))
            {
                foreach (var key in data.Keys)
                {
                    dictionary[key] = data[key];
                }
            }
            else
            {
                if (signedRequest.Expires == DateTime.MaxValue)
                {
                    dictionary["expires"] = 0;
                }
                else if (signedRequest.Expires != DateTime.MinValue)
                {
                    dictionary["expires"] = DateTimeConvertor.ToUnixTime(signedRequest.Expires);
                }

                if (settings != null && !string.IsNullOrEmpty(settings.AppSecret))
                {
                    dictionary["sig"] = GenerateSessionSignature(settings.AppSecret, dictionary);
                }
            }

            return(new FacebookSession(dictionary, settings));
        }
Example #2
0
        /// <summary>
        /// Creates a facebook session from a signed request.
        /// </summary>
        /// <param name="appSecret">
        /// The app secret.
        /// </param>
        /// <param name="signedRequest">
        /// The signed request.
        /// </param>
        /// <returns>
        /// The facebook session.
        /// </returns>
        internal static FacebookSession Create(string appSecret, FacebookSignedRequest signedRequest)
        {
            if (signedRequest == null || String.IsNullOrEmpty(signedRequest.AccessToken))
            {
                return(null);
            }

            var dictionary = new JsonObject
            {
                { "uid", signedRequest.UserId.ToString() },
                { "access_token", signedRequest.AccessToken }
            };

            if (signedRequest.Expires == DateTime.MaxValue)
            {
                dictionary["expires"] = 0;
            }
            else if (signedRequest.Expires != DateTime.MinValue)
            {
                dictionary["expires"] = DateTimeConvertor.ToUnixTime(signedRequest.Expires);
            }

            dictionary["sig"] = GenerateSessionSignature(appSecret, dictionary);

            return(new FacebookSession(dictionary));
        }
Example #3
0
        /// <summary>
        /// Try parsing the signed request.
        /// </summary>
        /// <param name="secret">
        /// The secret.
        /// </param>
        /// <param name="signedRequestValue">
        /// The signed request value.
        /// </param>
        /// <param name="signedRequest">
        /// The signed request.
        /// </param>
        /// <returns>
        /// Returns true if parsing was successful otherwise false.
        /// </returns>
        public static bool TryParse(string secret, string signedRequestValue, out FacebookSignedRequest signedRequest)
        {
            Contract.Requires(!String.IsNullOrEmpty(signedRequestValue));
            Contract.Requires(!String.IsNullOrEmpty(secret));
            Contract.Requires(signedRequestValue.Contains("."), Properties.Resources.InvalidSignedRequest);

            var result = TryParse(secret, signedRequestValue, 0, DateTimeConvertor.ToUnixTime(DateTime.UtcNow), false);

            signedRequest = result == null ? null : new FacebookSignedRequest(result);
            return(result != null);
        }
Example #4
0
        /// <summary>
        /// Try parsing the signed request.
        /// </summary>
        /// <param name="secret">
        /// The secret.
        /// </param>
        /// <param name="signedRequestValue">
        /// The signed request value.
        /// </param>
        /// <param name="signedRequest">
        /// The signed request.
        /// </param>
        /// <returns>
        /// Returns true if parsing was successful otherwise false.
        /// </returns>
        public static bool TryParse(string secret, string signedRequestValue, out FacebookSignedRequest signedRequest)
        {
            if (string.IsNullOrEmpty(signedRequestValue))
            {
                throw new ArgumentNullException("signedRequestValue");
            }
            if (string.IsNullOrEmpty(secret))
            {
                throw new ArgumentNullException("secret");
            }

            var result = TryParse(secret, signedRequestValue, 0, DateTimeConvertor.ToUnixTime(DateTime.UtcNow), false);

            signedRequest = result == null ? null : new FacebookSignedRequest(result);
            return(result != null);
        }
Example #5
0
        /// <summary>
        /// Try parsing the signed request.
        /// </summary>
        /// <param name="secret">
        /// The secret.
        /// </param>
        /// <param name="signedRequestValue">
        /// The signed request value.
        /// </param>
        /// <param name="signedRequest">
        /// The signed request.
        /// </param>
        /// <returns>
        /// Returns true if parsing was successful otherwise false.
        /// </returns>
        public static bool TryParse(string secret, string signedRequestValue, out FacebookSignedRequest signedRequest)
        {
            Contract.Requires(!String.IsNullOrEmpty(signedRequestValue));
            Contract.Requires(!String.IsNullOrEmpty(secret));
            Contract.Requires(signedRequestValue.Contains("."), Properties.Resources.InvalidSignedRequest);

            var result = TryParse(secret, signedRequestValue, 0, DateTimeConvertor.ToUnixTime(DateTime.UtcNow), false);
            signedRequest = result == null ? null : new FacebookSignedRequest(result);
            return result != null;
        }
Example #6
0
        /// <summary>
        /// Creates a facebook session from a signed request.
        /// </summary>
        /// <param name="appSecret">
        /// The app secret.
        /// </param>
        /// <param name="signedRequest">
        /// The signed request.
        /// </param>
        /// <returns>
        /// The facebook session.
        /// </returns>
        internal static FacebookSession Create(string appSecret, FacebookSignedRequest signedRequest)
        {
            if (signedRequest == null || String.IsNullOrEmpty(signedRequest.AccessToken))
            {
                return null;
            }

            var dictionary = new JsonObject
            {
                { "uid", signedRequest.UserId.ToString() },
                { "access_token", signedRequest.AccessToken }
            };

            if (signedRequest.Expires == DateTime.MaxValue)
            {
                dictionary["expires"] = 0;
            }
            else if (signedRequest.Expires != DateTime.MinValue)
            {
                dictionary["expires"] = DateTimeConvertor.ToUnixTime(signedRequest.Expires);
            }

            dictionary["sig"] = GenerateSessionSignature(appSecret, dictionary);

            return new FacebookSession(dictionary);
        }
Example #7
0
        /// <summary>
        ///  Gets the facebook session from the http request.
        /// </summary>
        /// <param name="appId">
        /// The app id.
        /// </param>
        /// <param name="appSecret">
        /// The app secret.
        /// </param>
        /// <param name="httpContext">
        /// The http context.
        /// </param>
        /// <returns>
        /// Returns the facebook session if found, otherwise null.
        /// </returns>
        internal static FacebookSession GetSession(string appId, string appSecret, HttpContextBase httpContext, FacebookSignedRequest signedRequest)
        {
            Contract.Requires(!string.IsNullOrEmpty(appId));
            Contract.Requires(!string.IsNullOrEmpty(appSecret));
            Contract.Requires(httpContext != null);
            Contract.Requires(httpContext.Items != null);
            Contract.Requires(httpContext.Request != null);
            Contract.Requires(httpContext.Request.Params != null);

            // If the session is not null, we explicitly DO NOT want to 
            // read from the cookie. Cookies in iFrames == BAD
            bool readSessionFromCookie = signedRequest == null;

            FacebookSession facebookSession = null;
            var httpRequest = httpContext.Request;
            var items = httpContext.Items;
            if (items[HttpContextKey] == null)
            {
                if (signedRequest == null)
                {
                    // try creating session from signed_request if exists.
                    signedRequest = FacebookSignedRequest.GetSignedRequest(appSecret, httpContext);
                }

                if (signedRequest != null)
                {
                    facebookSession = FacebookSession.Create(appSecret, signedRequest);
                }

                if (readSessionFromCookie && facebookSession == null)
                {
                    // try creating session from cookie if exists.
                    var sessionCookieValue = GetSessionCookieValue(appId, httpRequest);
                    if (!string.IsNullOrEmpty(sessionCookieValue))
                    {
                        facebookSession = FacebookSession.ParseCookieValue(appSecret, sessionCookieValue);
                    }
                }

                if (facebookSession != null)
                {
                    items.Add(HttpContextKey, facebookSession);
                }
            }
            else
            {
                facebookSession = items["facebook_session"] as FacebookSession;
            }

            return facebookSession;
        }
Example #8
0
        /// <summary>
        ///  Gets the Facebook session from the http request.
        /// </summary>
        /// <param name="appId">
        /// The app id.
        /// </param>
        /// <param name="appSecret">
        /// The app secret.
        /// </param>
        /// <param name="httpContext">
        /// The http context.
        /// </param>
        /// <returns>
        /// Returns the Facebook session if found, otherwise null.
        /// </returns>
        internal static FacebookSession GetSession(IFacebookApplication settings, HttpContextBase httpContext, FacebookSignedRequest signedRequest)
        {
            if (settings == null)
            {
                throw new ArgumentNullException("settings");
            }
            if (string.IsNullOrEmpty(settings.AppId))
            {
                throw new Exception("settings.AppId is null.");
            }
            if (string.IsNullOrEmpty(settings.AppSecret))
            {
                throw new Exception("settings.AppSecret is null.");
            }
            if (httpContext == null)
            {
                throw new ArgumentNullException("httpContext");
            }

            // If the session is not null, we explicitly DO NOT want to
            // read from the cookie. Cookies in iFrames == BAD
            bool readSessionFromCookie = signedRequest == null;

            FacebookSession facebookSession = null;
            var             httpRequest     = httpContext.Request;
            var             items           = httpContext.Items;

            if (items[HttpContextKey] == null)
            {
                if (signedRequest == null)
                {
                    // try creating session from signed_request if exists.
                    signedRequest = FacebookSignedRequest.GetSignedRequest(settings.AppId, settings.AppSecret, httpContext);
                }

                if (signedRequest != null)
                {
                    facebookSession = FacebookSession.Create(settings, signedRequest);
                }

                if (readSessionFromCookie && facebookSession == null)
                {
                    // try creating session from cookie if exists.
                    var sessionCookieValue = GetSessionCookieValue(settings.AppId, httpRequest);
                    if (!string.IsNullOrEmpty(sessionCookieValue))
                    {
                        facebookSession = FacebookSession.ParseCookieValue(settings, sessionCookieValue);
                    }
                }

                if (facebookSession != null)
                {
                    items.Add(HttpContextKey, facebookSession);
                }
            }
            else
            {
                facebookSession = items["facebook_session"] as FacebookSession;
            }

            return(facebookSession);
        }
Example #9
0
        /// <summary>
        /// Try parsing the signed request.
        /// </summary>
        /// <param name="facebookApplication">
        /// The Facebook application.
        /// </param>
        /// <param name="signedRequestValue">
        /// The signed request value.
        /// </param>
        /// <param name="signedRequest">
        /// The signed request.
        /// </param>
        /// <returns>
        /// Returns true if parsing was successful otherwise false.
        /// </returns>
        public static bool TryParse(IFacebookApplication facebookApplication, string signedRequestValue, out FacebookSignedRequest signedRequest)
        {
            if (facebookApplication == null)
            {
                throw new ArgumentNullException("facebookApplication");
            }

            return(TryParse(facebookApplication.AppSecret, signedRequestValue, out signedRequest));
        }
Example #10
0
        /// <summary>
        /// Gets the facebook signed request from the http request.
        /// </summary>
        /// <param name="appSecret">
        /// The app Secret.
        /// </param>
        /// <param name="httpContext">
        /// The http context.
        /// </param>
        /// <returns>
        /// Returns the signed request if found otherwise null.
        /// </returns>
        internal static FacebookSignedRequest GetSignedRequest(string appSecret, HttpContextBase httpContext)
        {
            Contract.Requires(httpContext != null);
            Contract.Requires(httpContext.Request != null);
            Contract.Requires(httpContext.Request.Params != null);

            var items       = httpContext.Items;
            var httpRequest = httpContext.Request;
            FacebookSignedRequest signedRequest;

            if (items[HttpContextKey] == null)
            {
                signedRequest         = (httpRequest.Params.AllKeys.Contains(SignedRequestKey) && !string.IsNullOrEmpty(httpRequest.Params[SignedRequestKey])) ? FacebookSignedRequest.Parse(appSecret, httpRequest.Params[SignedRequestKey]) : null;
                items[HttpContextKey] = signedRequest;
            }
            else
            {
                signedRequest = items[HttpContextKey] as FacebookSignedRequest;
            }
            return(signedRequest);
        }
Example #11
0
        /// <summary>
        /// Try parsing the signed request.
        /// </summary>
        /// <param name="facebookApplication">
        /// The facebook application.
        /// </param>
        /// <param name="request">
        /// The request.
        /// </param>
        /// <param name="signedRequest">
        /// The signed request.
        /// </param>
        /// <returns>
        /// Returns true if parsing is successful otherwise false.
        /// </returns>
        public static bool TryParse(IFacebookApplication facebookApplication, HttpRequestBase request, out FacebookSignedRequest signedRequest)
        {
            signedRequest = null;

            return(request.Params.AllKeys.Contains(SignedRequestKey) &&
                   TryParse(facebookApplication, request.Params[SignedRequestKey], out signedRequest));
        }
Example #12
0
        /// <summary>
        /// Try parsing the signed request.
        /// </summary>
        /// <param name="facebookApplication">
        /// The facebook application.
        /// </param>
        /// <param name="signedRequestValue">
        /// The signed request value.
        /// </param>
        /// <param name="signedRequest">
        /// The signed request.
        /// </param>
        /// <returns>
        /// Returns true if parsing was successful otherwise false.
        /// </returns>
        public static bool TryParse(IFacebookApplication facebookApplication, string signedRequestValue, out FacebookSignedRequest signedRequest)
        {
            Contract.Requires(facebookApplication != null);
            Contract.Requires(!string.IsNullOrEmpty(facebookApplication.AppSecret));
            Contract.Requires(!String.IsNullOrEmpty(signedRequestValue));
            Contract.Requires(signedRequestValue.Contains("."), Properties.Resources.InvalidSignedRequest);

            return(TryParse(facebookApplication.AppSecret, signedRequestValue, out signedRequest));
        }
Example #13
0
        /// <summary>
        /// Gets the facebook signed request from the http request.
        /// </summary>
        /// <param name="appSecret">
        /// The app Secret.
        /// </param>
        /// <param name="httpContext">
        /// The http context.
        /// </param>
        /// <returns>
        /// Returns the signed request if found otherwise null.
        /// </returns>
        internal static FacebookSignedRequest GetSignedRequest(string appId, string appSecret, HttpContextBase httpContext)
        {
            if (httpContext == null)
            {
                throw new ArgumentNullException("httpContext");
            }

            var items       = httpContext.Items;
            var httpRequest = httpContext.Request;
            FacebookSignedRequest signedRequest;

            if (items[HttpContextKey] == null)
            {
                signedRequest = httpRequest.Params.AllKeys.Contains(SignedRequestKey) && !string.IsNullOrEmpty(httpRequest.Params[SignedRequestKey]) ? FacebookSignedRequest.Parse(appSecret, httpRequest.Params[SignedRequestKey]) : null;
                if (signedRequest == null && !string.IsNullOrEmpty(appId))
                {
                    var signedRequestCookieValue = GetSignedRequestCookieValue(appId, httpRequest);
                    if (!string.IsNullOrEmpty(signedRequestCookieValue))
                    {
                        signedRequest = Parse(appSecret, signedRequestCookieValue);
                    }
                }

                items[HttpContextKey] = signedRequest;
            }
            else
            {
                signedRequest = items[HttpContextKey] as FacebookSignedRequest;
            }
            return(signedRequest);
        }
Example #14
0
        /// <summary>
        /// Try parsing the signed request.
        /// </summary>
        /// <param name="facebookApplication">
        /// The facebook application.
        /// </param>
        /// <param name="request">
        /// The request.
        /// </param>
        /// <param name="signedRequest">
        /// The signed request.
        /// </param>
        /// <returns>
        /// Returns true if parsing is successful otherwise false.
        /// </returns>
        public static bool TryParse(IFacebookApplication facebookApplication, HttpRequestBase request, out FacebookSignedRequest signedRequest)
        {
            if (request.Params.AllKeys.Contains(SignedRequestKey) && !string.IsNullOrEmpty(request.Params[SignedRequestKey]))
            {
                return(TryParse(facebookApplication, request.Params[SignedRequestKey], out signedRequest));
            }
            if (facebookApplication != null && !string.IsNullOrEmpty(facebookApplication.AppId))
            {
                var signedRequestCookieValue = GetSignedRequestCookieValue(facebookApplication.AppId, request);
                return(TryParse(facebookApplication, signedRequestCookieValue, out signedRequest));
            }

            signedRequest = null;
            return(false);
        }
Example #15
0
        /// <summary>
        /// Try parsing the signed request.
        /// </summary>
        /// <param name="facebookApplication">
        /// The facebook application.
        /// </param>
        /// <param name="signedRequestValue">
        /// The signed request value.
        /// </param>
        /// <param name="signedRequest">
        /// The signed request.
        /// </param>
        /// <returns>
        /// Returns true if parsing was successful otherwise false.
        /// </returns>
        public static bool TryParse(IFacebookApplication facebookApplication, string signedRequestValue, out FacebookSignedRequest signedRequest)
        {
            Contract.Requires(facebookApplication != null);
            Contract.Requires(!string.IsNullOrEmpty(facebookApplication.AppSecret));
            Contract.Requires(!String.IsNullOrEmpty(signedRequestValue));
            Contract.Requires(signedRequestValue.Contains("."), Properties.Resources.InvalidSignedRequest);

            return TryParse(facebookApplication.AppSecret, signedRequestValue, out signedRequest);
        }
Example #16
0
        /// <summary>
        /// Try parsing the signed request.
        /// </summary>
        /// <param name="facebookApplication">
        /// The facebook application.
        /// </param>
        /// <param name="request">
        /// The request.
        /// </param>
        /// <param name="signedRequest">
        /// The signed request.
        /// </param>
        /// <returns>
        /// Returns true if parsing is successful otherwise false.
        /// </returns>
        public static bool TryParse(IFacebookApplication facebookApplication, HttpRequestBase request, out FacebookSignedRequest signedRequest)
        {
            signedRequest = null;

            return request.Params.AllKeys.Contains(SignedRequestKey) &&
                   TryParse(facebookApplication, request.Params[SignedRequestKey], out signedRequest);
        }
Example #17
0
        /// <summary>
        ///  Gets the facebook session from the http request.
        /// </summary>
        /// <param name="appId">
        /// The app id.
        /// </param>
        /// <param name="appSecret">
        /// The app secret.
        /// </param>
        /// <param name="httpContext">
        /// The http context.
        /// </param>
        /// <returns>
        /// Returns the facebook session if found, otherwise null.
        /// </returns>
        internal static FacebookSession GetSession(string appId, string appSecret, HttpContextBase httpContext, FacebookSignedRequest signedRequest)
        {
            Contract.Requires(!string.IsNullOrEmpty(appId));
            Contract.Requires(!string.IsNullOrEmpty(appSecret));
            Contract.Requires(httpContext != null);
            Contract.Requires(httpContext.Items != null);
            Contract.Requires(httpContext.Request != null);
            Contract.Requires(httpContext.Request.Params != null);

            // If the session is not null, we explicitly DO NOT want to
            // read from the cookie. Cookies in iFrames == BAD
            bool readSessionFromCookie = signedRequest == null;

            FacebookSession facebookSession = null;
            var             httpRequest     = httpContext.Request;
            var             items           = httpContext.Items;

            if (items[HttpContextKey] == null)
            {
                if (signedRequest == null)
                {
                    // try creating session from signed_request if exists.
                    signedRequest = FacebookSignedRequest.GetSignedRequest(appSecret, httpContext);
                }

                if (signedRequest != null)
                {
                    facebookSession = FacebookSession.Create(appSecret, signedRequest);

                    httpContext.Session[HttpContextKey] = facebookSession;
                }
                else if (null != httpContext.Session[HttpContextKey])
                {
                    facebookSession = httpContext.Session[HttpContextKey] as FacebookSession;
                }
                else if (!string.IsNullOrEmpty(httpContext.Request["code"]))
                {
                    facebookSession = FacebookSession.Create(appSecret, httpContext.Request["code"]);
                }

                if (readSessionFromCookie && facebookSession == null)
                {
                    // try creating session from cookie if exists.
                    var sessionCookieValue = GetSessionCookieValue(appId, httpRequest);
                    if (!string.IsNullOrEmpty(sessionCookieValue))
                    {
                        facebookSession = FacebookSession.ParseCookieValue(appSecret, sessionCookieValue);
                    }
                }

                if (facebookSession != null)
                {
                    items.Add(HttpContextKey, facebookSession);
                    httpContext.Session[HttpContextKey] = facebookSession;
                }
            }
            else
            {
                facebookSession = items["facebook_session"] as FacebookSession;
            }

            return(facebookSession);
        }