Java 春季保安及;FacebookOAuth2.0与GraphAPI的集成

Java 春季保安及;FacebookOAuth2.0与GraphAPI的集成,java,facebook,spring,facebook-graph-api,spring-security,Java,Facebook,Spring,Facebook Graph Api,Spring Security,请至少提供伪应用程序上下文和控制器/过滤器,用于验证和/或自动注册Facebook用户 这个链接:不会做。事实上,我会给任何将其作为答案发布的人加上负号。我花了两个小时在这件事上,但我没有让它发挥作用。在这次努力之后,我比平时更加大胆,也更加愚蠢:-( 我真的希望看到facebook connect的解决方案,并将facebook JavaScript API的使用限制在绝对最低限度。 以下链接显示了我需要的内容: 请只发布这个问题的代码。我已经得到了我能处理的所有建议 更新 我有servle

请至少提供伪应用程序上下文和控制器/过滤器,用于验证和/或自动注册Facebook用户

这个链接:不会做。事实上,我会给任何将其作为答案发布的人加上负号。我花了两个小时在这件事上,但我没有让它发挥作用。在这次努力之后,我比平时更加大胆,也更加愚蠢:-(

我真的希望看到facebook connect的解决方案,并将facebook JavaScript API的使用限制在绝对最低限度。 以下链接显示了我需要的内容:

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

更新 我有servlet解决方案,如果有人感兴趣,请在此处发布答案:

事实上,我昨晚刚刚完成了Facebook Graph API身份验证的非javascript实现。我在a**中经历了巨大的痛苦,但它运行良好

我使用了您在上面发布的链接中的示例作为起点,也使用了其中的代码作为起点。我必须编写自己的FaceBookGraphHauthenticationProvider和FaceBookGraphHauthenticationFilter的实现,但现在它按照我希望的方式工作

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

以下是使身份验证正常工作所需的步骤:

  • 为用户获取一个“代码”,这是通过以下调用完成的:(作用域是您希望从FB请求的所有权限)。此调用将创建一个“身份验证代码”,然后将其发送回您的“重定向uri”(我声明为http://{my FB app registered domain}/j_spring_安全性_身份验证检查)

  • 一旦你有了这个“代码”,你需要在你的AuthenticationProvider中打一个电话,为你的用户会话检索一个访问令牌:这个URL看起来像:?client\u id=你的\u APP\u id&redirect\u uri=你的\u URL&client\u secret=你的\u APP\u secret&code=上面的\u代码。你必须确保你的“redirect\u uri”与您在#1中所做的相同。您将使用Apache的HttpClient之类的工具进行上述调用

  • 现在有了这个access_令牌(在上面的响应主体中),您可以通过以下URL获取用户的配置文件信息:{access_token from over.)。响应将是JSON格式的。您还可以将access_令牌与所有图形API一起使用,以发布状态、图片等

  • 我在家里有一些代码,它们有我的完整实现,我很乐意与大家分享


    我希望这至少有一点帮助。我建议使用Spring社交应用程序开始发布状态、图片、墙上的东西等。这将是一个开始了解FB Spring交互的好地方。

    以下是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
                };
            }
        }
    

    你能解释一下你当前遇到的错误吗?更多关于如何/为什么这不起作用的信息?我有一个完整的facebook oauth 2.0实现,没有任何javascript…但是它在.net mvc框架中使用C#你想看看吗?@Mat Banik:Iv给出了我当前使用的代码转储…看一看,让我看看知道它是否能使你成功sense@Mat我已经使用spring security和oauth实现了一个服务器端解决方案。参见Mulki,当前规范显示访问令牌响应为json。您的实现显示它作为querystring参数返回。这只是规范和facebook实现之间的差异吗?Mulki,是否考虑了此方法d OAuth 2?我可以使用类似的过程通过FB对用户进行身份验证吗?嗨..我有一些问题…你能通过电子邮件给我一些代码示例吗?我想将我现有的身份验证(使用spring security)与Facebook Connect(或登录)集成在一起…如果你不介意,请发电子邮件给我danielrobertusp@gmail.comHi丹尼尔…不幸的是,这个项目已经过时了:(如果你有一些具体的问题,我很乐意回答他们…谢谢你的回答..如果你不介意,请访问我的问题
      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;
            }
        }