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 がユーザーを認証した直後にのみトリガーされるため、認証トークンの有効期限が切れていないはずです。このエラーを処理する (つまり、システムでユーザーを認証しない) ようにコーディングしていますが、これまでのところ、問題の原因として次の 2 つの可能性が考えられます。

  1. トークンを取得した後、Facebook の呼び出しが速すぎます。Facebook で新しい認証トークンを関連するすべてのサーバーに渡すレプリケーションの遅延がある場合に発生する可能性があります。
  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 に答える