Оказывается, что (хотя это не задокументировано) нам нужно обменять код на access_token самостоятельно.Я думаю, что это пустая трата, так как это было хорошо в старом печенье.Это было быстро и легко получить access_token.
Во всяком случае.Чтобы получить access_token из нового cookie, вам нужно сделать следующее:
public string ReturnAccessToken()
{
HttpCookie cookie = htc.Request.Cookies[string.Format("fbsr_{0}", facebookAppID)];
string jsoncode = System.Text.ASCIIEncoding.ASCII.GetString(FromBase64ForUrlString(cookie.Value.Split(new char[] { '.' })[1]));
JsonData data = JsonMapper.ToObject(jsoncode);
getAccessToken(data["code"].ToJson()
}
private string getAccessToken(string code)
{
//Notice the empty redirect_uri! And the replace on the code we get from the cookie.
string url = string.Format("https://graph.facebook.com/oauth/access_token?client_id={0}&redirect_uri={1}&client_secret={2}&code={3}", "YOUR_APP_ID", "", "YOUR_APP_SECRET", code.Replace("\"", ""));
System.Net.HttpWebRequest request = System.Net.WebRequest.Create(url) as System.Net.HttpWebRequest;
System.Net.HttpWebResponse response = null;
using (response = request.GetResponse() as System.Net.HttpWebResponse)
{
System.IO.StreamReader reader = new System.IO.StreamReader(response.GetResponseStream());
string retVal = reader.ReadToEnd();
return retVal;
}
}
public byte[] FromBase64ForUrlString(string base64ForUrlInput)
{
int padChars = (base64ForUrlInput.Length % 4) == 0 ? 0 : (4 - (base64ForUrlInput.Length % 4));
StringBuilder result = new StringBuilder(base64ForUrlInput, base64ForUrlInput.Length + padChars);
result.Append(String.Empty.PadRight(padChars, '='));
result.Replace('-', '+');
result.Replace('_', '/');
return Convert.FromBase64String(result.ToString());
}
Это может показаться немного избыточным, но я полагаю, вы можете сохранить access_token в переменной сеанса.Если вы сделаете это и разместите свое приложение на Facebook, вы должны знать, что оно не будет работать в IE 6, 7 и 8, если пользователь установил в своем браузере средние настройки конфиденциальности.Для этого есть обходной путь, но поскольку он не является частью этого вопроса, я не буду его писать.Если люди действительно этого хотят, напишите комментарий, и я покажу его:)
----------------------------------- EDIT ------------------------------------------
При использовании любого из старых браузеров IE вы не можете использовать файлы cookie или переменные сеанса на страницах, которые имеют Iframed , например на ваших страницах в Facebook.Это проблема, которая не может быть решена в достаточной степени при кодировании.Под достаточным я имею в виду, что решение не является хорошим.Вам нужно установить p3p-заголовок в вашем ответе.Конечно, вы можете сделать это при кодировании всех страниц, которые вы обслуживаете, но самое простое решение (если вы используете сервер .NET для размещения своих страниц) - это настроить политику p3p для IIS.Руководство по этому вопросу можно найти в http://support.microsoft.com/kb/324013.. Не имеет значения, что вы пишете в политике p3p (если вы проверите собственные Facebook, вы увидите, что они используют «У нас нет политики p3p),важно то, что что-то стоит. У меня были проблемы только с использованием случайного текста, но если вы используете текст в примере, проблем быть не должно:)
Мне потребовалось целую вечность, чтобы выяснить,так что я надеюсь, что кто-то может использовать это: D