Facebook c# sdk Facebook c#sdk始终使用同一帐户登录
我将此方法与Facebook C#SDK(6.0.10.0)一起使用,以获得授权并检索访问Facebook的令牌:-Facebook c# sdk Facebook c#sdk始终使用同一帐户登录,facebook-c#-sdk,Facebook C# Sdk,我将此方法与Facebook C#SDK(6.0.10.0)一起使用,以获得授权并检索访问Facebook的令牌:- public static void FacebookLogon() { string clientId = "xxxxxxxxxxxxxxxxx"; string redirectUrl = Biz.BizFolders.ExpandUrl("CallbackHandlers/FacebookCallba
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();
}
公共静态字符串GetFacebookAccessToken()
{
if(String.IsNullOrEmpty((String)HttpRuntime.Cache[“访问令牌])==true)
{
Dictionary args=GetFacebookOauthTokens(HttpContext.Current.Request.Params[“code]”);
HttpRuntime.Cache.Insert(“访问令牌”,args[“访问令牌”],null,DateTime.Now.AddMinutes(Convert.ToDouble(args[“expires”])),TimeSpan.Zero);
}
返回HttpRuntime.Cache[“访问令牌”].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;
}
公共静态字典GetFacebookOauthTokens(字符串代码)
{
字典标记=新字典();
字符串clientId=“xxxxxxxx”;
字符串clientSecret=“yyyyyyyyyy”;
string redirectUrl=Biz.BizFolders.ExpandUrl(“CallbackHandlers/FacebookCallback.ashx”);
string scope=“读取好友列表,用户状态”;
字符串url=string.Format(“https://graph.facebook.com/oauth/access_token?client_id={0}&redirect_uri={1}&client_secret={2}&code={3}&scope={4}”,
clientId、重定向URL、clientSecret、代码、范围);
HttpWebRequest-request=WebRequest.Create(url)为HttpWebRequest;
使用(HttpWebResponse=request.GetResponse()作为HttpWebResponse)
{
StreamReader=新的StreamReader(response.GetResponseStream());
string retVal=reader.ReadToEnd();
foreach(retVal.Split('&')中的字符串标记)
{
tokens.Add(token.Substring(0,token.IndexOf(“=”)),
子字符串(token.IndexOf(“=”)+1,token.Length-token.IndexOf(“=”-1));
}
}
归还代币;
}
所有这些都非常有效。但不幸的是,我遇到了三个问题:-
- 我从未被提示登录facebook。我的应用程序总是日志的 无论我是否登录facebook,我都会与同一用户保持联系
- “
me=api.Get(“me”)代码>'始终返回同一个人。我不知道它是从哪里得到这些信息的
- 当我使用“me/feed”阅读新闻提要时,我只收到消息
是我贴的,没有其他人
我的应用程序目前在facebook中注册为沙盒应用程序。我试着改变这个模式,但没什么不同。我也尝试过添加开发人员和测试人员,但也没有什么乐趣。如果有人知道为什么会发生这种情况,那将对我很有帮助。我无法确定你的应用程序的正确流程。但我很确定您面临的问题是由于访问令牌造成的。
通过服务器端生成的访问令牌有效期为2个月。这意味着您可以使用它代表用户执行图形api调用,直到令牌过期。这就是为什么当您调用
me=api.Get(“me”)时,它会返回同一个人的详细信息代码>
这里有一个很好的解释
对于上一个问题,me/feed
返回用户的时间线帖子。要获取用户的新闻提要,您需要调用me/home