このアプローチを 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 のサンドボックス アプリとして登録されています。このモードを変更してみましたが、違いはありませんでした。また、開発者とテスターを追加しようとしましたが、そこにも喜びはありません。なぜこれが起こっているのかについて誰かが何か考えを持っているなら、それは私にとって本当に役に立ちます.