6

我想让人们用“Facebook登录”登录。但是,我想知道它是否足够安全,或者我只是做错了。

成功登录后我得到的是用户数据,其中包含 facebook_id,由于我使用的是 asp.net,因此我将其插入到由 JavaScript 请求通过处理程序传递到服务器的数据库中。

但是,我认为通过恶意使用,可以更改该数据。并将垃圾插入服务器,甚至插入不同的 facebook_id。

所以我想知道“Facebook登录”是否足够安全,或者我做错了。我考虑过将客户端数据传递给服务器的其他选项 - 通过使用隐藏的 runat=server 文本框回发服务器,但恶意使用仍然可以更改这些文本框。我在这里读过关于让用户在他们的 Facebook 用户名中添加密码的选项,但这听起来有点不友好。

我对吗?这是一种更安全的方法吗?Facebook 是否在客户端浏览器上放置了我可以从服务器读取的任何 cookie?好像很多网站都使用这个“Facebook登录”,可能还有另一种我没有想到的方式......

4

3 回答 3

4

将访问令牌传递给服务器(或从 cookie Facebook 集中检查),然后让服务器调用https://graph.facebook.com/me?access_token=...并以这种方式获取 Facebook ID。您可以通过从 javascript sdk调用FB.getLoginStatus来获取 access_token。

于 2012-02-04T15:36:42.737 回答
0

从服务器进行独立调用很重要,尤其是当您将他们的 facebook 用户 ID 存储在数据库或其他东西中时。这样,您就知道它是否有效。

首先,在 Facebook Javascript SDK 中调用FB.init函数后,您想通过 Javascript SDK 获取用户的访问令牌和 facebook 用户 id,如下所示:

            FB.getLoginStatus(function (response)
            {
                if (response.status === 'connected')
                {
                    var token = response.authResponse.accessToken;
                    var facebookUserID = response.authResponse.userID;
                }
            });

其次,一旦您获得了令牌和 facebook 用户 ID,您将希望将这些变量传递给您的服务器。如果您将 WCF 或其他形式的 Web 服务与JSON.NET一起使用,则可以创建如下方法:

        [WebInvokeAttribute(BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        [OperationContractAttribute]
        public Stream AuthenticateFacebook(string facebookUserId, string token)
        {
            var json = new WebClient().DownloadString(string.Format("https://graph.facebook.com/me?access_token={0}", token));

            JObject parsedJson = JObject.Parse(json);

            //Ensure that there isn't a random Facebook server error
            if (parsedJson["error"] != null)
            {
                throw new FaultException("Error parsing Facebook token.");
            }

            //Ensure the facebook user ID passed in via the client matches the one received from the server.
            if (Convert.ToString(parsedJson["id"]) != facebookUserId)
            {
                throw new FaultException("Facebook login ids do not match. Something fishy is going on...");
            }

            //Now you know you have a valid facebook login id. Do your database stuff or whatever else here.


        }

您现在已经验证了用户就是他们所说的那个人。

于 2013-06-04T18:14:00.177 回答
0

您可以使用 oauth 将此操作转移到服务器端。

看看这篇博文:

http://you.arenot.me/2010/09/28/facebooks-graph-api-and-asp-net/

于 2012-02-04T16:55:18.630 回答