Консольное приложение, использующее расширенные разрешения Facebook offline_access и SDK Facebook C # - PullRequest
1 голос
/ 16 декабря 2010

Я - беженец из старого набора инструментов разработчика Facebook, портирующего мое приложение на более новый SDK Facebook C #. Я разработал сторону веб-приложения MVC для моего решения, но у меня также есть консольное приложение, которое я запускаю в пакетном режиме как часть моего общего решения. Я получаю расширенное разрешение offline_access для всех моих пользователей и сохраняю сеансовый ключ с неограниченным сроком действия для последующего использования в моем консольном приложении.

С помощью инструментария для разработчиков Facebook мне удалось раскрутить API-интерфейс Connect Session и REST с помощью моего API-ключа, API-ключа и сохраненного пользовательского сеансового ключа и совершать вызовы API-интерфейса Facebook.

В Facebook C # SDK не-сетевые образцы, кажется, полагаются на то, что для управления интерактивным входом в систему используется какой-то элемент управления браузером. Это не будет работать для пользователей консольной пакетной обработки приложений в автономном режиме.

У меня так далеко:

string oAuthAccessToken = "{access token}"
var app = new Facebook.FacebookApp(oAuthAccessToken );

// now I can make api calls like this:
dynamic currentPermissionsJson = new ExpandoObject();
currentPermissionsJson = app.Query(string.Format("SELECT publish_stream, offline_access, email from permissions where uid = {0}", {userid}));
var currentPermissions = ((JsonArray)currentPermissionsJson)[0] as IDictionary<string, object>;

и понеслось.

Я просто застрял в том, как преобразовать мои существующие сохраненные сеансовые ключи в токены доступа OAuth Facebook. Я вижу, как я могу построить POST к https://graph.facebook.com/oauth/exchange_sessions с такими параметрами, как

client_id={my app id}
&client_secret={my app secret}
&sessions={previously stored session keys}

и верните маркер доступа в ответ.

Но я думаю, что SDK должен предложить какой-то способ сделать это для меня. Или это?

1 Ответ

0 голосов
/ 20 декабря 2010

К сожалению, в текущем SDK Facebook C # нет помощников для обмена токенами доступа. Я создал проблему, и я постараюсь решить ее в ближайшее время. http://facebooksdk.codeplex.com/workitem/5788

Пока я написал это. Попробуйте и дайте мне знать, как это работает:

public class FacebookOAuth
{

    public static IEnumerable<ExchangeSessionResult> ExchangeSessions(string appId, string appSecret, params string[] sessionKeys)
    {
        WebClient client = new WebClient();
        var dict = new Dictionary<string, object>();
        dict.Add("client_id", appId);
        dict.Add("client_secret", appSecret);
        dict.Add("sessions", String.Join(",", sessionKeys));
        string data = dict.ToJsonQueryString();
        string result = client.UploadString("https://graph.facebook.com/oauth/exchange_sessions", data);
        return Newtonsoft.Json.JsonConvert.DeserializeObject<ExchangeSessionResult[]>(result);
    }

}

public class ExchangeSessionResult
{

    [Newtonsoft.Json.JsonProperty("access_token")]
    public string AccessToken { get; set; }

    [Newtonsoft.Json.JsonProperty("expires")]
    public string Expires { get; set; }

}
...