Spring Security & Facebook OAuth 2.0 интеграция с Graph API
Пожалуйста, хотя бы псевдо (но из рабочей среды не "может быть, это должно работать") контекст приложения и контроллер/фильтр, который будет аутентифицировать и/или автоматически регистрировать пользователей Facebook.
Эта ссылка: http://blog.kadirpekel.com/2009/11/09/facebook-connect-integration-with-spring-security/ не подойдет. На самом деле я поставлю минус любому, кто опубликует его в качестве ответа. Я провел 2 часа с этой штукой, и мне не удалось заставить ее работать. Я закончила немного смелее и чувствуя себя более глупо, чем обычно после этого усилия : - (
Я бы очень хотел увидеть OAuth 2.0 решение для facebook connect. И ограничить использование Facebook JavaScript API до абсолютного минимума.
Следующая ссылка показывает, что мне нужно: http://www.richardnichols.net/2010/06/implementing-facebook-oauth-2-0-authentication-in-java/
Пожалуйста, напишите только код на этот вопрос. У меня уже есть все советы, с которыми я могу справиться.
Обновление
У меня есть решение сервлета и опубликованный ответ здесь, Если кто-то заинтересован: пример подключения Facebook в JSP (tomcat)
2 ответа:
Вот реализация 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
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 baseclass (класс, из которого происходит 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; } }
На самом деле я только что закончил свою не-javascript, реализацию аутентификации Facebook Graph API прошлой ночью. Я был гигантской болью в А**, но это работает, и это работает довольно хорошо.
В качестве отправной точки я использовал пример из ссылки, которую вы разместили выше, а также код из здесь в качестве отправной точки. Мне пришлось написать свою собственную реализацию их FacebookGraphAuthenticationProvider и их FacebookGraphAuthenticationFilter, но теперь она работает так, как я хочу, чтобы так и было.
Необходимо создать реализации обоих этих файлов, поместить фильтр в цепочку фильтров и создать реализацию сервиса Spring Security UserDetailsService, который поставщик может использовать для управления информацией об учетной записи пользователя. У меня есть код на моей машине дома, который я могу отправить вам по электронной почте, если хотите.
Вот шаги, которые я должен был использовать, чтобы заставить аутентификацию работать:
Получить "код" для пользователя, это делается путем создания следующий звонок: 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 app registered domain}/j_spring_security_authentication_check.
После того, как у вас есть этот "код", вам нужно сделать звонок внутри вашего 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_ABOVE. Вы должны убедиться, что ваш" redirect_uri " совпадает с тем, что вы сделали в #1. Вы сделаете вышеуказанный вызов, используя что-то вроде HttpClient от Apache или что-то подобное.
Теперь с этим access_token (который входит в тело ответ выше), вы можете получить информацию о профиле вашего пользователя со следующим URL: https://graph.facebook.com/me?access_token={ACCESS_TOKEN сверху). Ответ будет в формате JSON. Вы также можете использовать access_token со всеми API graph для публикации статуса, изображений и т. д.
У меня дома есть код, который имеет мою полную реализацию, и я был бы рад поделиться.
Надеюсь, это хоть немного поможет. Я предлагаю использовать социальное приложение Spring, чтобы получить началось с публикации статуса, фотографий, стеновых материалов и т. д. Это будет хорошим местом, чтобы начать смотреть на взаимодействие FB-Spring.