3

主な質問:C#SDKを介して60日間のアクセストークンの2時間のアクセストークンをどのように延長する必要がありますか?コードがすでに2時間のアクセストークンと交換されているセクションのサンプルを提供できますか?

背景:私はここを見回してさまざまな解決策を試してきましたが、まだ自分に合った解決策を見つけていません。/ me呼び出しを正常に実行して現在のユーザーに関する情報を取得できますが、アクセストークンを拡張しようとすると失敗します。

このアプリの目的は、ユーザーが投稿を設定し、事後のいいねやコメントを一定期間監視できるようにすることです。明らかに、これには60日間のトークンが必要です。

パーマネントトークンをリクエストできるときに他の誰かが作業の90%を行った後、私はこのプロジェクトを引き継ぎます。60日間のトークンを使用できるように修正するのが私の仕事です。私は非常に愚かなフォローアップの質問をするかもしれません。準備して!

現在のフロー:ユーザーが投稿を設定し、ボタンをクリックすると、JavaScriptSDKを介してアプリ/ログインをFacebookに認証するように求められます。彼らがログインした後、JavaScriptで他の無関係なものを処理し、それをC#にAJAXして、データベースに情報(トークンを含む)を保存して投稿します。すべてがうまくいき、javascriptでアクセストークンを問題なく取得し、その2時間のトークンを使用して、ログインしているユーザーに関する情報を取得できますが、延長しようとすると、以下で説明する2つのエラーのいずれかが発生します。それらを引き起こすコード。

私が試したこと:

作業中:これは別の投稿で見つけたと思います。var fbClient = new FacebookClient(accessToken);

            Dictionary<string, object> parameters = new Dictionary<string, object>();
            parameters.Add("client_id", appId);
            parameters.Add("redirect_uri", redirectURI);
            parameters.Add("client_secret", appSecret);
            parameters.Add("code", accessToken);

            var result = fbClient.Get("/me", parameters);

動作しない:これは、ここやSDKドキュメントを含むさまざまな場所から発生しました。リダイレクトURLを含めて、最初にアクセストークンを取得したときのものと一致する必要があると言っている人を見てきましたが、JavaScriptでそれを行い、リダイレクトURLを使用しませんでした。辞書parameters2=new Dictionary();

            parameters2.Add("client_id", appId);
            //parameters2.Add("redirect_uri", redirectURI);
            parameters2.Add("client_secret", appSecret);
            //parameters2.Add("code", accessToken);
            parameters2.Add("grant_type", "fb_exchange_token");
            parameters2.Add("fb_exchange_token", accessToken);

            var result2 = fbClient.Get("/oauth/access_token", parameters2);

エラー:{Newtonsoft.Json.JsonReaderException:値の解析中に予期しない文字が見つかりました:a。1行目、位置1。エラー2:grant_typeとfb_exchange_tokenをコメントアウトし、コードとリダイレクトをコメント解除すると、次のメソッドと同じエラーが発生します。

動作しない:これは、私の変数に一致するように名前をコピー/貼り付けする別の投稿から取得しました。 有効期限トークンを取得できません

            dynamic result3 = new ExpandoObject();
            try
            {
                dynamic parameters3 = new ExpandoObject();
                parameters3.grant_type = "fb_exchange_token";
                parameters3.fb_exchange_token = accessToken;
                parameters3.client_id = appId;
                parameters3.client_secret = appSecret;
                result3 = fbClient.Get("oauth/access_token", parameters);
            }
            catch (FacebookOAuthException err)
            {
                result3.error = "Error";
                result3.message = err.Message;
            }
            catch (Exception err)
            {
                result3.error = "Error";
                result3.message = err.Message;
            }

エラー:{(OAuthException)(OAuthException)無効な検証コード形式。}

4

2 に答える 2

6

コールバックであるハンドラーファイルでFacebook.NETとJson.NETで次のコードを使用します。

public void ProcessRequest (HttpContext context)
    {
        if (context.Request.Params.Get("error_reason") == "user_denied")
        {
            context.Response.Write("Access Denied");
        }
        else if (context.Request.Params.Get("code") != null && context.Request.Params.Get("code") != "")
        {
            string shorttoken = HttpUtility.ParseQueryString(HttpUtil.GetHtmlPage("https://graph.facebook.com/oauth/access_token?client_id=" + APP_ID + "&redirect_uri=http://huadianz.me/mvp/auth/FacebookOAuth.ashx&client_secret=" + APP_SECRET + "&code=" + context.Request.Params.Get("code")))["access_token"];
            string longtoken = HttpUtility.ParseQueryString(HttpUtil.GetHtmlPage("https://graph.facebook.com/oauth/access_token?client_id=" + APP_ID + "&client_secret=" + APP_SECRET + "&grant_type=fb_exchange_token&fb_exchange_token=" + shorttoken))["access_token"];

            Facebook.FacebookClient fc = new Facebook.FacebookClient(longtoken);
            dynamic result = fc.Get("me");

            context.Response.Redirect("/");
            //Store Token here
        }
    }

私のユーティリティファイルはここにあります:

public static class HttpUtil
{
    public static string GetHtmlPage(string strURL)
    {
        String strResult;
        WebResponse objResponse;
        WebRequest objRequest = HttpWebRequest.Create(strURL);
        objResponse = objRequest.GetResponse();
        using (StreamReader sr = new StreamReader(objResponse.GetResponseStream()))
        {
            strResult = sr.ReadToEnd();
            sr.Close();
        }
        return strResult;
    }
}
于 2012-08-24T00:27:17.730 に答える
0

C#SDKを使用してFacebookアクセストークンを更新する方法を参照してください。「oauth/access_token」をリクエストするだけでは不十分であり、そこでもパラメータを指定する必要があります。そこでのテクニックは私のために働いた。

于 2012-08-24T19:20:40.737 に答える