Facebook C # SDK.Как выполнить автоматический вход пользователей, если они уже зарегистрированы на facebook.com? - PullRequest
1 голос
/ 25 марта 2011

Вот проблема,

Я хочу, чтобы пользователь автоматически авторизировался на моем сайте MVC3, если он уже авторизовался на facebook.com.

Если он не авторизован на facebook.comЯ просто покажу кнопку входа, и они смогут войти, щелкнув по ней, как обычно.

Кажется, я не могу найти способ определить, имел ли пользователь логин с facebook.com, если я не заставлю приложение выполнить прямой переход.в LoginUrl Facebook, который не подходит для пользователей, которые не вошли в систему, поскольку это предложит им страницу, где они должны войти.Я все еще хочу разрешить гостевой доступ без учетной записи Facebook.

Есть идеи?Спасибо миллион.

РЕДАКТИРОВАТЬ:

Извините, я забыл упомянуть, что ситуация относится только к пользователю, который одобряет использовать мое приложение.Как только они одобрят использование моего приложения, я смогу определить их статус входа в Facebook.

Ответы [ 2 ]

0 голосов
/ 02 апреля 2014
public class FacebookOAuth
{
    private string _loginUrl = "https://www.facebook.com/login.php?login_attempt=1";
    private string _redirectUrl = "https://www.facebook.com/connect/login_success.html";
    private string _authorizeUrl = "https://graph.facebook.com/oauth/authorize?client_id={0}&redirect_uri={1}&scope={2}";
    private string _tokenUrl = "https://graph.facebook.com/oauth/access_token?code={0}&client_id={1}&redirect_uri={2}";
    private CookieContainer _cookieContainer = new CookieContainer();
    private string _httpsRefUrl = "https://facebook.com";


    public string Authenticate(UserInfo user)
    {
        // get post data
        var postData = GetPostData(user, _loginUrl);
        // authentificate        
        var content = GetContant(_loginUrl, postData);
        return content;
    }

    private string GetPostData(UserInfo user, string loginUrl)
    {
        // get content from login form
        var content = GetContant(loginUrl);
        return GetPostDataFromContent(content, user);
    }

    private string GetPostDataFromContent(string content, UserInfo user)
    {   
        var dictOfPostData = new Dictionary<string, string>();
        if (!string.IsNullOrEmpty(content))
        {
            var doc = XDocument.Parse(content);
            var inputs = doc.Descendants(XName.Get("input"));
            foreach (var item in inputs)
            {
                var attrbuteName = item.Attributes(XName.Get("name")).FirstOrDefault();
                var attrbuteValue = item.Attributes(XName.Get("value")).FirstOrDefault();
                if (attrbuteName != null)
                {
                    switch (attrbuteName.Value)
                    {
                        case "lsd":
                        case "default_persistent":
                        case "timezone":
                        case "lgnrnd":
                        case "lgnjs":
                        case "locale":
                            dictOfPostData.Add(attrbuteName.Value, attrbuteValue.Value);
                            break;
                        case "email":
                            dictOfPostData.Add(attrbuteName.Value, user.Login);
                            break;
                        case "pass":
                            dictOfPostData.Add(attrbuteName.Value, user.Password);
                            break;

                    }
                }
            }
        }
        return string.Join("&", dictOfPostData.Select(pair => string.Format("{0}={1}", pair.Key, pair.Value))); ;
    }
    /// <summary>
    /// <see cref="GetContant(string, string, Func&lt;HttpWebResponse, string&gt;)"/>
    /// </summary>
    /// <param name="url"></param>
    /// <returns></returns>
    public string GetContant(string url)
    {
        return GetContant(url, string.Empty, null);
    }

    /// <summary>
    /// <see cref="GetContant(string, string, Func&lt;HttpWebResponse, string&gt;)"/>
    /// </summary>
    /// <param name="url"></param>
    /// <param name="postData"></param>
    /// <returns></returns>
    public string GetContant(string url, string postData)
    {
        return GetContant(url, postData, null);
    }

    /// <summary>
    /// <see cref="GetContant(string, string, Func&lt;HttpWebResponse, string&gt;)"/>
    /// </summary>
    /// <param name="url"></param>
    /// <param name="funcParseResponse"></param>
    /// <returns></returns>
    public string GetContant(string url, Func<HttpWebResponse, string> funcParseResponse)
    {
        return GetContant(url, string.Empty, funcParseResponse);
    }

    /// <summary>
    /// Get content from web page or write post data
    /// If post data empty call method=GET, else POST
    /// </summary>
    /// <param name="url">Start url</param>
    /// <param name="postData">Post data, can be null</param>
    /// <param name="funcParseResponse"></param>
    /// <returns></returns>
    public string GetContant(string url, string postData, Func<HttpWebResponse, string> funcParseResponse)
    {
        var content = string.Empty;
        var encoding = Encoding.UTF8;
        var webRequest = (HttpWebRequest)HttpWebRequest.Create(url);

        if (!string.IsNullOrEmpty(postData))
        {
            webRequest.Method = "POST";
        }

        webRequest.Referer = _httpsRefUrl;
        webRequest.UserAgent = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/7.0)";
        webRequest.Accept = "text/html, application/xhtml+xml, */*";
        webRequest.Headers.Add("Accept-Language", "ru");
        webRequest.ContentType = "application/x-www-form-urlencoded";
        webRequest.CookieContainer = _cookieContainer;
        webRequest.KeepAlive = true;
        webRequest.AllowAutoRedirect = false;

        if (!string.IsNullOrEmpty(postData))
        {
            // Write post data
            var dataBytes = encoding.GetBytes(postData);
            webRequest.ContentLength = dataBytes.Length;
            webRequest.GetRequestStream().Write(dataBytes, 0, dataBytes.Length);
        };

        // make request
        using (var webResponse = (HttpWebResponse)webRequest.GetResponse())
        {
            using (var stream = webResponse.GetResponseStream())
            {
                var streamReader = new StreamReader(stream, encoding);
                content = streamReader.ReadToEnd();
            }
            var parseResult = funcParseResponse != null ? funcParseResponse.Invoke(webResponse) : string.Empty;
            if (!string.IsNullOrEmpty(parseResult))
            {
                return parseResult;
            }
            // If we have status 302
            if (webResponse.StatusCode == HttpStatusCode.Found)
            {
                var redirectUrl = Convert.ToString(webResponse.Headers["Location"]);
                // call handly
                content = this.GetContant(redirectUrl, funcParseResponse);
            }
        }
        return content;
    }
}

public class UserInfo
    {
        public UserInfo(string login, String pwd)
        {
            Login = login;
            Password = pwd;
        }
        public string Login { get; set; }
        public string Password { get; set; }

    }
0 голосов
/ 25 марта 2011

Ответ: вы не можете. По крайней мере, не нарушая TOS Facebook и, возможно, хотя бы один или два закона.

РЕДАКТИРОВАТЬ: Ваш первоначальный вопрос звучал так, как будто вы хотели попытаться захватить сеанс пользователя Facebook. То, о чем вы говорите здесь в комментариях, требует использования Facebook Connect / Facebook для веб-сайтов.

Вы хотели бы начать здесь: https://developers.facebook.com/docs/guides/web

...