Spring Security и Facebook OAuth 2.0 Интеграция с Graph API - PullRequest
8 голосов
/ 10 января 2011

Пожалуйста, по крайней мере, псевдо (но из рабочей среды, а не «может быть, это должно работать») контекст приложения и контроллер / фильтр, которые будут аутентифицировать и / или автоматически регистрировать пользователей Facebook.

Эта ссылка: http://blog.kadirpekel.com/2009/11/09/facebook-connect-integration-with-spring-security/ не подойдет. На самом деле я поставлю минус очко любому, кто опубликует это как ответ. Я провел 2 часа с вещью, и я не заставил ее работать. Я закончил немного смелее и чувствую себя более глупо, чем обычно после этого усилия :-(

Я бы очень хотел увидеть решение OAuth 2.0 для подключения через Facebook. И ограничить использование API JavaScript Facebook до абсолютного минимума.

Следующая ссылка показывает, что мне нужно: http://www.richardnichols.net/2010/06/implementing-facebook-oauth-2-0-authentication-in-java/

Пожалуйста, оставьте только код для этого вопроса. Я уже получил все советы, с которыми я могу справиться.

UPDATE

У меня есть решение с сервлетом и я отправил ответ здесь, если кому-то интересно: Пример подключения Facebook в JSP (tomcat)

Ответы [ 2 ]

3 голосов
/ 24 января 2011

Вот MVC-реализация Facebook OAuth 2.0 Код на C # и, надеюсь, его сходство с Java поможет вам.

Контроллер (точка входа): Контроллер (в MVC) - это точка в коде, где элемент управления достигает после того, как кто-то нажимает на ссылку для входа.

 public ActionResult Authenticate()
        {
                var oauthFacebook = new FacebookOAuth();
                if (Request["code"] == null)
                {
                    //Redirect the user to Facebook for authorization.
                    Response.Redirect(oauthFacebook.AuthorizationLinkGet());
                }
                else
                {
                    //Get the access token and secret.
                    oauthFacebook.AccessTokenGet(Request["code"]);
                    if (oauthFacebook.Token.Length > 0)
                    {
                        //We can now make our api calls
                        var user = oauthFacebook.GetAttributes();
                    }
                }
        }

FacebookOAuth Class

public class FacebookOAuth : Oauth
    {
        public FacebookOAuth()
        {
            Authorize = "https://graph.facebook.com/oauth/authorize";
            AccessToken = "https://graph.facebook.com/oauth/access_token";
            CallbackUrl = "http://<YourURLHere>/Authenticate";
            AttributesBaseUrl = "https://graph.facebook.com/me/?access_token=";
            ConsumerKey = ConfigurationManager.AppSettings["FacebookConsumerKey"];//Ur Consumer Key goes here
            ConsumerSecret = ConfigurationManager.AppSettings["FacebookConsumerSecret"];//Ur Consumer secret goes here
            Provider = "Facebook";
        }

        public override string AuthorizationLinkGet()
        {
            return
                string.Format(
                    "{0}?client_id={1}&redirect_uri={2}&scope=email,user_education_history,user_location,user_hometown",
                    Authorize, ConsumerKey, CallbackUrl);
        }

        public User GetAttributes()
        {
            string attributesUrl = string.Format("{0}{1}", AttributesBaseUrl, Token);
            string attributes = WebRequest(Method.Get, attributesUrl, String.Empty);
            var FacebookUser = new JavaScriptSerializer().Deserialize<FacebookUser>(attributes);
            return new User()
            {
                FirstName = FacebookUser.first_name,
                MiddleName = FacebookUser.middle_name,
                LastName = FacebookUser.last_name,
                Locale = FacebookUser.locale,
                UserEmail = FacebookUser.email,
                AuthProvider = Provider,
                AuthToken=Token
            };
        }
    }

Базовый класс OAuth (класс, из которого происходит FacebookOAuth)

  public abstract class Oauth
    {
        #region Method enum

        public enum Method
        {
            Get,
            Post,
            Delete
        } ;

        #endregion

        protected string AccessToken;
        protected string AttributesBaseUrl;
        protected string Authorize;
        protected string CallbackUrl;
        protected string ConsumerKey;
        protected string ConsumerSecret;
        public string Provider { get; protected set; }

        public string Token { get; set; }

        public virtual string AuthorizationLinkGet()
        {
            return
                string.Format(
                    "{0}?client_id={1}&redirect_uri={2}&scope=publish_stream,email,user_education_history,user_location",
                    Authorize, ConsumerKey, CallbackUrl);
        }

        public void AccessTokenGet(string authToken)
        {
            Token = authToken;
            string accessTokenUrl = string.Format("{0}?client_id={1}&redirect_uri={2}&client_secret={3}&code={4}",
                                                  AccessToken, ConsumerKey, CallbackUrl, ConsumerSecret, authToken);
            string response = WebRequest(Method.Get, accessTokenUrl, String.Empty);

            if (response.Length > 0)
            {
                //Store the returned access_token
                NameValueCollection qs = HttpUtility.ParseQueryString(response);

                if (qs["access_token"] != null)
                {
                    Token = qs["access_token"];
                }
            }
        }

        public string WebRequest(Method method, string url, string postData)
        {
            StreamWriter requestWriter;
            string responseData = string.Empty;

            var webRequest = System.Net.WebRequest.Create(url) as HttpWebRequest;
            if (webRequest != null)
            {
                webRequest.Method = method.ToString();
                webRequest.ServicePoint.Expect100Continue = false;
                webRequest.Timeout = 20000;

                if (method == Method.Post)
                {
                    webRequest.ContentType = "application/x-www-form-urlencoded";
                    //POST the data.
                    requestWriter = new StreamWriter(webRequest.GetRequestStream());
                    try
                    {
                        requestWriter.Write(postData);
                    }

                    finally
                    {
                        requestWriter.Close();
                    }
                }
                responseData = WebResponseGet(webRequest);
            }
            return responseData;
        }

        public string WebResponseGet(HttpWebRequest webRequest)
        {
            StreamReader responseReader = null;
            string responseData;
            try
            {
                responseReader = new StreamReader(webRequest.GetResponse().GetResponseStream());
                responseData = responseReader.ReadToEnd();
            }
            finally
            {
                if (webRequest != null) webRequest.GetResponse().GetResponseStream().Close();
                if (responseReader != null) responseReader.Close();
            }
            return responseData;
        }
    }
3 голосов
/ 24 января 2011

Я на самом деле только что закончил свою не-JavaScript-реализацию реализации Аутентификации API Graph на Facebook прошлой ночью.Я был ужасной болью в а **, но это работает, и это работает довольно хорошо.

Я использовал пример по указанной выше ссылке в качестве отправной точки, а также код из здесь в качестве отправной точки.Мне пришлось написать свою собственную реализацию их FacebookGraphAuthenticationProvider и их FacebookGraphAuthenticationFilter, но теперь это работает так, как я хочу.

Вам необходимо создать реализации обоих этих файлов, поместить свой фильтр в цепочку фильтров и создать реализацию Spring Security UserDetailsService, которую провайдер может использовать для управления информацией учетной записи пользователя.У меня дома есть код, который я могу отправить вам по электронной почте, если хотите.

Вот шаги, которые мне пришлось использовать, чтобы заставить аутентификацию работать:

  1. Получить «код» для пользователя, это делается с помощью следующего вызова: https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&scope=email,read_stream (Область действия - это все разрешения, которые вы хотите запросить у FB).Этот вызов создаст «код аутентификации», который затем будет отправлен обратно на ваш «redirect_uri» (который я указал как http://{my зарегистрированный домен приложения fb} /j_spring_security_authentication_check.

  2. Как только выИмея этот «код», вам нужно сделать вызов внутри вашего AuthenticationProvider, который будет получать access_token для сеанса вашего пользователя: этот URL выглядит следующим образом: https://graph.facebook.com/oauth/access_token? client_id = YOUR_APP_ID & redirect_uri = YOUR_URL & client_secret = YOUR_APP_SECRET & code = THE_CODE_FROMубедитесь, что ваш "redirect_uri" такой же, как тот, который вы делали в # 1. Вы сделаете вышеупомянутый вызов, используя что-то вроде HttpClient Apache или тому подобное.

  3. Теперь с этим access_token(который приводится в тексте вышеупомянутого ответа), вы можете получить информацию о профиле вашего пользователя по следующему URL: https://graph.facebook.com/me?access_token={ACCESS_TOKEN сверху).Ответ будет в формате JSON.Вы также можете использовать access_token со всеми API графика для публикации статуса, изображений и т. П.,

    Надеюсь, это поможет хоть немного.Я предлагаю использовать приложение Spring Social, чтобы начать с публикации статуса, картинок, материалов на стене и т. Д. Это будет хорошим местом для начала изучения взаимодействия FB-Spring.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...