用户从Facebook注销后如何获取新的Api.AccessToken

时间:2011-06-17 02:11:13

标签: facebook facebook-graph-api

我正在使用Facebook Graph Toolkit并进行ASP.NET网站开发。

这个工具包中有一个Api对象,这个Api.AccessToken让我很头疼!

以下是问题描述:

  1. 用户访问我的网站(例如,此案例是IE 8浏览器)。

  2. 用户点击登录FB(以便我的应用程序通过Api图表检索他的FB信息)。

  3. 用户登录FB凭证并批准应用程序。

  4. 用户被重定向回他点击登录到FB按钮的同一页面(在步骤2中,因为该按钮将调用方法RedirectToFacebookAuthorization())。

  5. 用户然后从Facebook.com注销(我的网站没有为此方案实现任何注销按钮)。

  6. 用户已成功退出FB帐户,重新访问我的网站。

  7. 我的网站抛出了如下的异常消息:

          OAuthException : Error validating access token: The session is invalid because the user logged out
    
  8. 用户点击我网站上的Login to FB按钮但没有响应(实际上,响应是再次抛出的异常消息)。即使他打开另一个IE浏览器窗口并单击按钮,也没有响应。我尝试过try / catch并捕获异常只是为了告知用户他已经从我的网站和facebook退出。

  9. 所以情况是如何让用户获得另一个有效的访问令牌...我只能想到用户必须点击我网站上的登录到FB按钮但是(之前的)访问令牌已经无效,第二次登录尝试无法覆盖。为了让用户使用他的FB重新登录我的网站,我测试的唯一方法是关闭浏览器窗口(但我不想要这样的用户体验,因为用户不知道他必须关闭浏览器并再次打开以登录我的网站。)

    即使用户选择访问Facebook.com并从那里登录,然后重新访问我的网站,他仍然没有通过身份验证,也不允许在我的网站上继续操作。

    请赐教我解决上述问题的方法。我使用的方法是错的吗?


    编辑:添加了代码以进一步说明

    这是我的代码和

        protected void Page_PreInit(object sender, EventArgs e)
    {
        RequireLogin = false;
        ExtendedPermissions = "offline_access,user_about_me,user_activities,user_birthday,";
    }
    
    protected void btn_fbLogin_Click(object sender, EventArgs e)
    {
        try
        {
            if (Api == null)
                RedirectToFacebookAuthorization();
        }
        catch (Exception ex)
        {
            Response.Write("Failed to login to Facebook.");
        }
    }
    
    protected void btn_FBMerge_Click(object sender, EventArgs e)
    {
        try
        {
            SqlConnection con = new SqlConnection(conStr);
            SqlCommand cmd = new SqlCommand("getEmail", con);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlParameter demai = new SqlParameter("@dem", SqlDbType.VarChar, 255);
            cmd.Parameters.Add(demai);
            cmd.Parameters["@dem"].Value = lbl_FBEmail.Text;
            SqlDataReader Dr;
            con.Open();
            Dr = cmd.ExecuteReader();
            if (Dr.Read())
            {
                if ((lbl_FBEmail.Text == Dr[9].ToString()))
                {
                    // grab each column from DR and place to asp:Labels...
                }
                else
                {
                    // show some error message
                }
            }
            else
            {
                // display another division and put the FB email, first name, last name and gender to 4 more labels
            }
        }
        catch (Exception ex)
        {
            Response.Write("Attempt to Merge Facebook failed");
        }
    }
    
    protected void btn_Confirm_Click(object sender, EventArgs e)
    {
        try
        {
            SqlConnection con = new SqlConnection(conStr);
            SqlCommand cmd = new SqlCommand("mergeFB", con);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlParameter dsomeID = new SqlParameter("@someID", SqlDbType.VarChar, 50);
            SqlParameter dfbID = new SqlParameter("@fbID", SqlDbType.VarChar, 50);
            cmd.Parameters.Add(dsomeID);
            cmd.Parameters.Add(dfbID);
            cmd.Parameters["@someid"].Value = lbl_MyID.Text;
            cmd.Parameters["@fbID"].Value = lbl_FBID.Text;
            con.Open();
            cmd.ExecuteNonQuery();
            con.Close();
            Response.Write("Your Facebook account has been added to mywebsite account successfully");
        }
        catch (Exception ex)
        {
            Response.Write("Attempt to Merge Facebook failed");
        }
    }
    

    当点击按钮(方法是btn_FBMerge_Click)并且IE让我永远回应并且Firefox给我错误时我发生了问题。

    如果我没有包含offline_access权限,当我点击btn_FBMerge_Click按钮时,我不会遇到这个奇怪的问题。然后,这仍然导致主要问题,即Api.AccessToken是我在原始问题中提到的无效问题。

1 个答案:

答案 0 :(得分:0)

如果用户令牌不再有效,则需要显示登录按钮以获取新的有效会话令牌。如果要获取未过期的令牌,可以提示用户输入“offline_access”扩展权限。但只有这样做才有必要,因为人们不喜欢在没有充分理由的情况下给予应用程序许可。