1

我正在使用 Facebook C# SDK 6.0.20 版对用户进行身份验证。

它对我来说很好,我能够获得用户的名字和姓氏。但是当我稍后尝试时,我得到了访问令牌,但fbClient.Get(“me”)失败并出现以下错误:

(OAuthException – #190) 验证访问令牌时出错:会话与当前存储的会话不匹配。这可能是因为用户在创建会话后更改了密码,或者 Facebook 出于安全原因更改了会话。

请帮忙。

当用户从身份验证对话框重定向回来时,我运行以下代码:

protected void Page_Load(object sender, EventArgs e)
{
    if (Request.Params["code"] != null)
    {
      Facebook.FacebookClient fbClient = new Facebook.FacebookClient(GetAccessToken());

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

        string firstName = me.first_name;
        string lastName = me.last_name;
        string email = me.email;
        string userID = me.id;
        string gender = me.gender;
        string dob = me.birthday;
        string locale = me.locale;
        string mStatus = me.relationship_status;            
    }

}

private string GetAccessToken()
{
    if (HttpRuntime.Cache["access_token"] == null)
    {
        Dictionary<string, string> args = GetOauthTokens(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();
}

private Dictionary<string, string> GetOauthTokens(string code)
{
    Dictionary<string, string> tokens = new Dictionary<string, string>();

    string clientId = "xxxxxxxxxxxxxxxxxx";
    string redirectUrl = "http://localhost:51215/TestFBWebSite/FacebookRedirect.aspx";
    string clientSecret = "xxxxxxxxxxxxxxxxxxxxxx";

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

    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;
}
4

3 回答 3

2

fbClient.Get("me") 确实有效(没有前面的“/”),这就是我们正在使用的并且它可以正常工作。

string redirectUrl = "http://localhost:51215/TestFBWebSite/FacebookRedirect.aspx";

我注意到这部分 - 我发现在使用 localhost(或 127.0.0.1)时集成不起作用,我们通过将“test.mydomain.com”的主机记录设置为指向 127.0.0.1 来解决这个问题

在我们的实时环境中,我们也偶尔会遇到 #190 错误。奇怪的是,只有在 Facebook 刚刚对用户进行身份验证后才会触发生成错误的位置,因此身份验证令牌不应该已经过期!我们正在编写代码来处理这个错误(即不要在我们的系统上验证用户身份),但是到目前为止,我认为导致问题的两种可能性是:

  1. 我们在获取令牌后调用 Facebook 的速度太快了 - 如果 Facebook 将新的 Auth 令牌传递到所有相关服务器时出现复制延迟,则有可能发生这种情况
  2. Facebook 的一般内部错误

我认为这可能是选项 1,但是我还没有找到足够的信息来支持它

于 2012-07-06T13:07:07.753 回答
1

我认为一开始有语法错误。

dynamic me = fbClient.Get("/me");

        string firstName = me.first_name;
        string lastName = me.last_name;
        string email = me.email;
        string userID = me.id;
        string gender = me.gender;
        string dob = me.birthday;
        string locale = me.locale;
        string mStatus = me.relationship_status; 

试试这个代码使用“\me”而不是“me”

于 2012-07-06T07:56:54.833 回答
0

如果您向陌生人发送更多好友请求,您的帐户将被阻止并出现 190 错误代码。所以取消请求并再次登录。

于 2014-01-24T22:52:09.773 回答