2011-06-17 57 views
0

我正在使用Facebook Graph Toolkit并进行ASP.NET网站开发。如何在用户从Facebook注销后获取新的Api.AccessToken

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

这里去问题描述:

  1. 用户访问我的网站(比如,这种情况下是IE 8浏览器)。

  2. 用户单击登录到FB(为了让我的应用程序通过Api图检索他的FB信息)。

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

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

  5. 用户然后从Facebook.com注销(我的网站尚未实施此场景的任何注销按钮)。

  6. 用户已成功从他的FB帐户注销,他重新访问我的网站。

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

     OAuthException : Error validating access token: The session is invalid because the user logged out 
    
  8. 上登录的用户点击到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

如果用户令牌不再有效,则需要显示登录按钮以获取新的有效会话令牌。如果您想获取不会过期的令牌,可以提示用户输入“offline_access”扩展权限。但只有在绝对必要的情况下才能做到这一点,因为人们不会无缘无故地给应用程序提供许可。

+0

我也尝试将offline_access添加到代码隐藏的扩展权限中。在用户从FB注销后,它给了我非常奇怪的行为(说用户已经批准了具有此权限的应用程序),然后通过单击Login to FB按钮在我的网站上再次登录,响应将永远存在。 – FBLover2011 2011-06-17 03:32:53

+0

在IE中,响应需要永久,但在Firefox中,它会引发此错误 “该页面没有正确重定向 Firefox检测到服务器正在以永远不会完成的方式重定向该地址的请求。” 我在这里做错了什么? – FBLover2011 2011-06-17 03:45:13

+0

听起来像你有某种无限重定向循环继续。没有看到任何代码难以猜测。 – bkaid 2011-06-17 03:47:15

相关问题