0

我将这种方法与 Facebook C# SDK (6.0.10.0) 一起使用来获得授权并检索 Facebook 的访问令牌:-

public static void FacebookLogon()
            {
            string clientId = "xxxxxxxxxxxxxxxxx";

            string redirectUrl = Biz.BizFolders.ExpandUrl("CallbackHandlers/FacebookCallback.ashx"); 

            string logonScope = "email,user_checkins,publish_stream,read_stream";

            string url = string.Format("https://graph.facebook.com/oauth/authorize?client_id={0}&redirect_uri={1}&scope={2}" 
                           , clientId , redirectUrl , logonScope);

            HttpContext.Current.Response.Redirect(url);
            }

按预期工作的回调是一个通用处理程序,如下所示:-

public class FacebookCallback : IHttpHandler , System.Web.SessionState.IRequiresSessionState

    {

    public void ProcessRequest(HttpContext context)
        {
        string newUrl = "";

        if (context.Request.Params["code"] != null)
            {
            // Accepted...

            string accessCode = GetFacebookAccessToken();
            FacebookClient api = new FacebookClient(accessCode);

            dynamic me = api.Get("me");

            if (me != null)
                {
                string id = me.id;
                LoadOrCreateUser(...);
                }

            }
        else
            {
            // Declined ....
            }

        }

    }
}

获取 facebook 访问令牌功能也可以按预期工作。

  public static string GetFacebookAccessToken()

        {

        if(String.IsNullOrEmpty((string)HttpRuntime.Cache["access_token"]) == true)
        {

            Dictionary<string, string> args = GetFacebookOauthTokens(HttpContext.Current.Request.Params["code"]);
            HttpRuntime.Cache.Insert("access_token" , args["access_token"] , null , DateTime.Now.AddMinutes(Convert.ToDouble(args["expires"])) , TimeSpan.Zero);
        }

    return HttpRuntime.Cache["access_token"].ToString();

    }

最后,它也可以正常工作,此函数检索访问令牌:-

public static Dictionary<string , string> GetFacebookOauthTokens(string code)
        {
    Dictionary<string , string> tokens = new Dictionary<string , string>();

    string clientId = "xxxxxxxx";
    string clientSecret = "yyyyyyyyyy";

    string redirectUrl = Biz.BizFolders.ExpandUrl("CallbackHandlers/FacebookCallback.ashx");

    string scope = "read_friendlists,user_status";

    string url = string.Format("https://graph.facebook.com/oauth/access_token?client_id={0}&redirect_uri={1}&client_secret={2}&code={3}&scope={4}" ,
                    clientId , redirectUrl , clientSecret , code , scope);

    HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;

    using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
        {

        StreamReader reader = new StreamReader(response.GetResponseStream());

        string retVal = reader.ReadToEnd();

        foreach (string token in retVal.Split('&'))
            {
            tokens.Add(token.Substring(0 , token.IndexOf("=")) ,
                token.Substring(token.IndexOf("=") + 1 , token.Length - token.IndexOf("=") - 1));
            }
        }

    return tokens;
    }

以上所有工作都很棒。但不幸的是,我遇到了 3 个问题:-

  • 从来没有提示我登录 Facebook。无论我是否登录 facebook,我的应用程序总是使用同一个用户登录。

  • ' me = api.Get("me");' 总是返回同一个人。我不知道它从哪里得到这些信息。

  • 当我使用“me/feed”阅读新闻提要时,我只收到
    我发布的消息,而没有其他消息。

我的应用程序目前在 facebook 中注册为沙盒应用程序。我尝试更改此模式,但没有任何区别。我也尝试过添加开发人员和测试人员,但也没有任何乐趣。如果有人对为什么会发生这种情况有任何想法,那对我真的很有帮助。

4

1 回答 1

0

我无法确定您的应用程序的正确流程。但我很确定您面临的问题是由于访问令牌。
通过服务器端生成的访问令牌有效期为 2 个月。这意味着您可以使用它代表用户执行图形 api 调用,直到令牌过期。这就是当您调用时它会返回同一个人的详细信息的原因me = api.Get("me");
这是一个很好的解释教程,适合初学者使用 Facebook C# SDK

对于您的最后一个问题,me/feed返回用户的时间线帖子。要获取用户的新闻提要,您需要调用me/home.

于 2013-06-25T08:00:26.093 回答