我正在使用Facebook Graph Toolkit并进行ASP.NET网站开发。如何在用户从Facebook注销后获取新的Api.AccessToken
在这个工具包中有一个Api对象,这个Api.AccessToken让我很头疼!
这里去问题描述:
用户访问我的网站(比如,这种情况下是IE 8浏览器)。
用户单击登录到FB(为了让我的应用程序通过Api图检索他的FB信息)。
用户使用他的FB凭证登录并批准应用程序。
用户被重定向回到他点击Login to FB按钮的同一页面(在步骤2中,因为该按钮将调用方法RedirectToFacebookAuthorization())。
用户然后从Facebook.com注销(我的网站尚未实施此场景的任何注销按钮)。
用户已成功从他的FB帐户注销,他重新访问我的网站。
我的网站抛出下面的异常消息:
OAuthException : Error validating access token: The session is invalid because the user logged out
上登录的用户点击到FB按钮在我的网站,但没有响应(实际上,响应再次抛回异常消息) 。即使他打开另一个IE浏览器窗口并点击按钮,也没有任何回应。我尝试了try/catch,并发现只有通知用户他已经从我的网站和Facebook注销。
因此,情况是如何让用户获得另一个有效的访问令牌......我只能认为它是用户必须在登录点击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是我在原始问题中提到的无效问题。
我也尝试将offline_access添加到代码隐藏的扩展权限中。在用户从FB注销后,它给了我非常奇怪的行为(说用户已经批准了具有此权限的应用程序),然后通过单击Login to FB按钮在我的网站上再次登录,响应将永远存在。 – FBLover2011 2011-06-17 03:32:53
在IE中,响应需要永久,但在Firefox中,它会引发此错误 “该页面没有正确重定向 Firefox检测到服务器正在以永远不会完成的方式重定向该地址的请求。” 我在这里做错了什么? – FBLover2011 2011-06-17 03:45:13
听起来像你有某种无限重定向循环继续。没有看到任何代码难以猜测。 – bkaid 2011-06-17 03:47:15