我正在使用Facebook Graph Toolkit并进行ASP.NET网站开发。
这个工具包中有一个Api对象,这个Api.AccessToken让我很头疼!
以下是问题描述:
用户访问我的网站(例如,此案例是IE 8浏览器)。
用户点击登录FB(以便我的应用程序通过Api图表检索他的FB信息)。
用户登录FB凭证并批准应用程序。
用户被重定向回他点击登录到FB按钮的同一页面(在步骤2中,因为该按钮将调用方法RedirectToFacebookAuthorization())。
用户然后从Facebook.com注销(我的网站没有为此方案实现任何注销按钮)。
用户已成功退出FB帐户,重新访问我的网站。
我的网站抛出了如下的异常消息:
OAuthException : Error validating access token: The session is invalid because the user logged out
用户点击我网站上的Login to 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是我在原始问题中提到的无效问题。
答案 0 :(得分:0)
如果用户令牌不再有效,则需要显示登录按钮以获取新的有效会话令牌。如果要获取未过期的令牌,可以提示用户输入“offline_access”扩展权限。但只有这样做才有必要,因为人们不喜欢在没有充分理由的情况下给予应用程序许可。