Facebook是否在2017年3月更改了他们的App开发者API?

时间:2017-03-30 07:04:19

标签: facebook asp.net-mvc-4 facebook-graph-api oauth-2.0 facebook-authentication

好吧,我是一个正在尝试开发一个Web应用程序的新人,其用户将通过Facebook进行身份验证。我正在MVC 4 .Net Framework.开发应用程序因为它的内部程序已经完成所以我不需要做太多编码。我刚刚将API IDSecret Key放在了范围

OAuthWebSecurity.RegisterFacebookClient(
                appId: "750397051803327",
                appSecret: "**************************");

这是我的申请http://imgur.com/a/k4Vd0 我的应用程序正确地完成了用户的用户许可。 http://imgur.com/a/bqzj5但在获得许可后,它不会通过显示此类异常http://imgur.com/a/h81Oh登录失败来提供用户的登录状态。我调试了代码结束,我发现它将isLoggedin发送为false http://imgur.com/a/UuLIe,因此我无法访问。

然而在我没有得到这样的例外的前2天。我的数据很简单。这是我之前数据的快照。 http://imgur.com/a/Bc49F

我再次需要那些数据,但是怎么样?我的应用程序仪表板中是否有任何需要更改的内容?可能我在应用程序仪表板中改变了一些东西。如果是,那么具体是什么? 另一件我很困惑的事情是什么需要产品?出于这个特殊原因,我是否需要产品中的任何内容来获取数据。如果是,那么我需要哪一个以及如何配置它以恢复我以前顺利获取数据的系统过程。

如果我从App Center添加PRODUCTS我正在获取另外两个密钥,例如Account Kit App SecretAccount Kit Client Token我需要将这些密钥用于我要求的案例。对于Products需要PRODUCTS特定的登录审批,或者根本不需要jsDocCompletion.enabled。我对如何配置应用程序感到困惑。

除了如何配置我的应用程序API之外,请建议我如何解决此问题。谢谢。

2 个答案:

答案 0 :(得分:0)

是!!!! 我得到了自己问题的解决方案。根据Facebook开发者bug报告所有Facebook日志从2017年3月28日起不起作用。他们还通过他们的开发者Facebook小组告诉我们。帖子link就在这里。

  

根据其中一个开发团队的说法,我们已经发现了这一点   facebook身份验证刚刚停止工作(美国东部时间下午2点)   我们管理的应用。应用程序没有改变,应用程序没有   暂停.....不知道在哪里报告这个,因为“状态”就是全部   好......

答案 1 :(得分:0)

根据Previous Answer,我得到了解决方案。在MVC4,每个人都写下他们的AppIDSecurityCode。由于facebook GRAPH API的更改,以前的链接被破坏了。因此,每个人都需要更改RegisterFacebookClient calss。但是这个类是.Net库中的密封类,所以任何人都无法扩展或覆盖它。因此,我们需要使用wrapper类。让我们考虑我的Wrapper类是FacebookClientV2Dot3,因此我的课程将是

using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Web;
using DotNetOpenAuth.AspNet.Clients;
using Newtonsoft.Json;

public class FacebookClientV2Dot3 : OAuth2Client
{
    #region Constants and Fields

    /// <summary>
    /// The authorization endpoint.
    /// </summary>
    private const string AuthorizationEndpoint = "https://www.facebook.com/dialog/oauth";

    /// <summary>
    /// The token endpoint.
    /// </summary>
    private const string TokenEndpoint = "https://graph.facebook.com/oauth/access_token";

    /// <summary>
    /// The user info endpoint.
    /// </summary>
    private const string UserInfoEndpoint = "https://graph.facebook.com/me";

    /// <summary>
    /// The app id.
    /// </summary>
    private readonly string _appId;

    /// <summary>
    /// The app secret.
    /// </summary>
    private readonly string _appSecret;

    /// <summary>
    /// The requested scopes.
    /// </summary>
    private readonly string[] _requestedScopes;

    #endregion

    /// <summary>
    /// Creates a new Facebook OAuth2 client, requesting the default "email" scope.
    /// </summary>
    /// <param name="appId">The Facebook App Id</param>
    /// <param name="appSecret">The Facebook App Secret</param>
    public FacebookClient(string appId, string appSecret)
        : this(appId, appSecret, new[] { "email" }) { }

    /// <summary>
    /// Creates a new Facebook OAuth2 client.
    /// </summary>
    /// <param name="appId">The Facebook App Id</param>
    /// <param name="appSecret">The Facebook App Secret</param>
    /// <param name="requestedScopes">One or more requested scopes, passed without the base URI.</param>
    public FacebookClient(string appId, string appSecret, params string[] requestedScopes)
        : base("facebook")
    {
        if (string.IsNullOrWhiteSpace(appId))
            throw new ArgumentNullException("appId");

        if (string.IsNullOrWhiteSpace(appSecret))
            throw new ArgumentNullException("appSecret");

        if (requestedScopes == null)
            throw new ArgumentNullException("requestedScopes");

        if (requestedScopes.Length == 0)
            throw new ArgumentException("One or more scopes must be requested.", "requestedScopes");

        _appId = appId;
        _appSecret = appSecret;
        _requestedScopes = requestedScopes;
    }

    protected override Uri GetServiceLoginUrl(Uri returnUrl)
    {
        var state = string.IsNullOrEmpty(returnUrl.Query) ? string.Empty : returnUrl.Query.Substring(1);

        return BuildUri(AuthorizationEndpoint, new NameValueCollection
                {
                    { "client_id", _appId },
                    { "scope", string.Join(" ", _requestedScopes) },
                    { "redirect_uri", returnUrl.GetLeftPart(UriPartial.Path) },
                    { "state", state },
                });
    }

    protected override IDictionary<string, string> GetUserData(string accessToken)
    {
        var uri = BuildUri(UserInfoEndpoint, new NameValueCollection { { "access_token", accessToken } });

        var webRequest = (HttpWebRequest)WebRequest.Create(uri);

        using (var webResponse = webRequest.GetResponse())
        using (var stream = webResponse.GetResponseStream())
        {
            if (stream == null)
                return null;

            using (var textReader = new StreamReader(stream))
            {
                var json = textReader.ReadToEnd();
                var extraData = JsonConvert.DeserializeObject<Dictionary<string, object>>(json);
                var data = extraData.ToDictionary(x => x.Key, x => x.Value.ToString());

                data.Add("picture", string.Format("https://graph.facebook.com/{0}/picture", data["id"]));

                return data;
            }
        }
    }

    protected override string QueryAccessToken(Uri returnUrl, string authorizationCode)
    {
        var uri = BuildUri(TokenEndpoint, new NameValueCollection
                {
                    { "code", authorizationCode },
                    { "client_id", _appId },
                    { "client_secret", _appSecret },
                    { "redirect_uri", returnUrl.GetLeftPart(UriPartial.Path) },
                });

        var webRequest = (HttpWebRequest)WebRequest.Create(uri);
        string accessToken = null;
        HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse();

        // handle response from FB 
        // this will not be a url with params like the first request to get the 'code'
        Encoding rEncoding = Encoding.GetEncoding(response.CharacterSet);

        using (StreamReader sr = new StreamReader(response.GetResponseStream(), rEncoding))
        {
            var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
            var jsonObject = serializer.DeserializeObject(sr.ReadToEnd());
            var jConvert = JsonConvert.DeserializeObject(JsonConvert.SerializeObject(jsonObject));

            Dictionary<string, object> desirializedJsonObject = JsonConvert.DeserializeObject<Dictionary<string, object>>(jConvert.ToString());
            accessToken = desirializedJsonObject["access_token"].ToString();
        }
        return accessToken;
    }

    private static Uri BuildUri(string baseUri, NameValueCollection queryParameters)
    {
        var keyValuePairs = queryParameters.AllKeys.Select(k => HttpUtility.UrlEncode(k) + "=" + HttpUtility.UrlEncode(queryParameters[k]));
        var qs = String.Join("&", keyValuePairs);

        var builder = new UriBuilder(baseUri) { Query = qs };
        return builder.Uri;
    }

    /// <summary>
    /// Facebook works best when return data be packed into a "state" parameter.
    /// This should be called before verifying the request, so that the url is rewritten to support this.
    /// </summary>
    public static void RewriteRequest()
    {
        var ctx = HttpContext.Current;

        var stateString = HttpUtility.UrlDecode(ctx.Request.QueryString["state"]);
        if (stateString == null || !stateString.Contains("__provider__=facebook"))
            return;

        var q = HttpUtility.ParseQueryString(stateString);
        q.Add(ctx.Request.QueryString);
        q.Remove("state");

        ctx.RewritePath(ctx.Request.Path + "?" + q);
    }
}

在这里查看我已用新版本链接替换所有API链接。

现在您需要修改

  

AuthConfig

只需使用包装类

OAuthWebSecurity.RegisterClient(new FacebookClientV2Dot3("AppID", "HassedPassword"));

然后一切顺利。你的Facebook登录将恢复到以前的状态。

但是,您可能会遇到有关此新API的新问题,而不是以前的API,问题是IP Whitelisting。像这样image。希望你除此之外什么都不需要。快乐的编码。