【问题标题】:Spring Security & Facebook OAuth 2.0 Integration with Graph APISpring Security 和 Facebook OAuth 2.0 与 Graph API 的集成
【发布时间】:2011-06-06 17:33:36
【问题描述】:

请至少是伪的(但来自工作环境而不是“也许这应该工作”)应用程序上下文和控制器/过滤器,它们将验证和/或自动注册 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/

请仅发布此问题的代码。我已经得到了我能处理的所有建议。

更新

如果有人感兴趣,我有 servlet 解决方案并在此处发布答案: Facebook Connect example in JSP (tomcat)

【问题讨论】:

  • 您能否添加一些关于您当前遇到的错误的解释。更多关于如何/为什么这不起作用?
  • 我有一个完整的 facebook oauth 2.0 实现,没有任何 javascript...但是它在 .net mvc 框架中使用 C# 你想看看吗?
  • @Mat Banik:我给出了我目前使用的代码转储...看看,让我知道它是否有意义
  • @Mat 我已经使用 spring security 和 oauth 实现了一个服务器端解决方案。见my solution below

标签: java facebook spring facebook-graph-api spring-security


【解决方案1】:

实际上我昨晚刚刚完成了我的非 JavaScript 实现 Facebook Graph API 身份验证。我在a**中是一个巨大的痛苦,但它有效并且运作良好。

我使用您上面发布的链接中的示例作为起点,以及 here 中的代码作为起点。我必须编写自己的 FacebookGraphAuthenticationProvider 和 FacebookGraphAuthenticationFilter 实现,但现在它按我想要的方式工作。

您需要创建这两个文件的实现,将您的过滤器放入过滤器链中,并创建一个 Spring Security UserDetailsS​​ervice 的实现,Provider 可以使用它来管理您的用户帐户信息。我在家里的机器上有一些代码,如果你愿意,我可以通过电子邮件发送给你。

以下是我必须使用的步骤才能使身份验证正常工作:

  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 app registered domain}/j_spring_security_authentication_check。

  2. 1234563 client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&client_secret=YOUR_APP_SECRET&code=THE_CODE_FROM_ABOVE。您必须确保您的“redirect_uri”与您在 #1 中所做的相同。您将使用 Apache 的 HttpClient 之类的东西进行上述调用。 1234563响应将采用 JSON 格式。您还可以将 access_token 与所有图形 API 一起使用来发布状态、图片等。

我家里有一些代码,其中包含我的完整实现,我很乐意分享。

我希望这至少会有所帮助。我建议使用 Spring Social 应用程序开始发布状态、图片、墙的东西等。这将是开始查看 FB-Spring 交互的好地方。

【讨论】:

  • 嗨..我有一些问题...你能把你的代码中的一些例子发邮件给我吗?我想将我现有的身份验证(使用 Spring Security)与 Facebook Connect(或登录)集成。如果您不介意,请发送电子邮件至 danielrobertusp@gmail.com
  • 嗨丹尼尔......不幸的是,这个项目早已不复存在:(如果您有一些具体问题,我很乐意回答......
  • 感谢您的回复。如果您不介意,请访问我的问题stackoverflow.com/questions/23440141/…
【解决方案2】:

这是 facebook OAuth 2.0 的 MVC 实现 代码在 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 基类(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;
        }
    }

【讨论】:

  • Mulki,当前规范显示访问令牌响应为 json。您的实现显示它作为查询字符串参数返回。这只是规范和 facebook 实现之间的区别吗?
  • Mulki,这种方法是否被视为 OAuth 2?我可以使用类似的流程让用户通过 FB 进行身份验证吗?
猜你喜欢
  • 2011-04-16
  • 2019-05-24
  • 1970-01-01
  • 2014-06-19
  • 2017-03-31
  • 2012-06-03
  • 1970-01-01
  • 2015-02-12
相关资源
最近更新 更多