我将这种方法与 Facebook C# SDK (6.0.10.0) 一起使用来获得授权并检索 Facebook 的访问令牌:-
public static void FacebookLogon()
{
string clientId = "xxxxxxxxxxxxxxxxx";
string redirectUrl = Biz.BizFolders.ExpandUrl("CallbackHandlers/FacebookCallback.ashx");
string logonScope = "email,user_checkins,publish_stream,read_stream";
string url = string.Format("https://graph.facebook.com/oauth/authorize?client_id={0}&redirect_uri={1}&scope={2}"
, clientId , redirectUrl , logonScope);
HttpContext.Current.Response.Redirect(url);
}
按预期工作的回调是一个通用处理程序,如下所示:-
public class FacebookCallback : IHttpHandler , System.Web.SessionState.IRequiresSessionState
{
public void ProcessRequest(HttpContext context)
{
string newUrl = "";
if (context.Request.Params["code"] != null)
{
// Accepted...
string accessCode = GetFacebookAccessToken();
FacebookClient api = new FacebookClient(accessCode);
dynamic me = api.Get("me");
if (me != null)
{
string id = me.id;
LoadOrCreateUser(...);
}
}
else
{
// Declined ....
}
}
}
}
获取 facebook 访问令牌功能也可以按预期工作。
public static string GetFacebookAccessToken()
{
if(String.IsNullOrEmpty((string)HttpRuntime.Cache["access_token"]) == true)
{
Dictionary<string, string> args = GetFacebookOauthTokens(HttpContext.Current.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();
}
最后,它也可以正常工作,此函数检索访问令牌:-
public static Dictionary<string , string> GetFacebookOauthTokens(string code)
{
Dictionary<string , string> tokens = new Dictionary<string , string>();
string clientId = "xxxxxxxx";
string clientSecret = "yyyyyyyyyy";
string redirectUrl = Biz.BizFolders.ExpandUrl("CallbackHandlers/FacebookCallback.ashx");
string scope = "read_friendlists,user_status";
string url = string.Format("https://graph.facebook.com/oauth/access_token?client_id={0}&redirect_uri={1}&client_secret={2}&code={3}&scope={4}" ,
clientId , redirectUrl , clientSecret , code , scope);
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;
}
以上所有工作都很棒。但不幸的是,我遇到了 3 个问题:-
从来没有提示我登录 Facebook。无论我是否登录 facebook,我的应用程序总是使用同一个用户登录。
'
me = api.Get("me");
' 总是返回同一个人。我不知道它从哪里得到这些信息。当我使用“me/feed”阅读新闻提要时,我只收到
我发布的消息,而没有其他消息。
我的应用程序目前在 facebook 中注册为沙盒应用程序。我尝试更改此模式,但没有任何区别。我也尝试过添加开发人员和测试人员,但也没有任何乐趣。如果有人对为什么会发生这种情况有任何想法,那对我真的很有帮助。