2010-12-16 3 views
1

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

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

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

Я получил это далеко:

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>; 

и понеслось.

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

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

и получить маркер доступа обратно в ответ.

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

+0

я получаю ближе (отражено в правок выше) ... Я думаю, что просто нужно немного синтаксического сахара или обертку делает POST к https: //graph.facebook.com/oauth/exchange_sessions с моим appID, секретным и ранее сохраненным ключом сеанса пользователя. – 2010-12-16 18:43:28

ответ

0

К сожалению, у нас нет помощников в текущем Facebook C# SDK для обмена токенами доступа. Я создал проблему, и я постараюсь получить ее там в ближайшее время. 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; } 

} 
+0

Спасибо Nathan, я придумал подобное решение с помощью WebRequest, но ваш чище. – 2010-12-23 15:51:28