Проблема с получением access_token после перехода на OAuth 2.0 - PullRequest
6 голосов
/ 26 августа 2011

Я попытался перенести мое приложение в процедуру OAuth 2.0.У меня проблемы с получением access_token из файла cookie, установленного API-интерфейсом JavaScript.Я декодирую информацию в куки, но вместо access_token и информации о пользователе я получаю код.Это кажется довольно странным изменением.Есть ли обходной путь для этого, потому что кажется, что вы не можете обменять свой код на access_token, если вы не указали redirect_uri, когда вы получили код.

Я рассмотрел просто получение access_token изответ в JavaScript API и сохранение его в cookie-файле, но это своего рода наносит ущерб всей цели расширенной безопасности, и я хотел спросить, существует ли правильный способ сделать это.

Может быть, яделаю что-то не так, и если это так, скажите мне:)

РЕДАКТИРОВАТЬ Я знаю, что cookie содержит подписанный запрос, но в соответствии с документами, что подписанный запрос должен содержатьинформация, которую я запрашиваю, например access_token и uid, но в моем случае она содержит только код.Это та часть, которую я не понимаю.

Ответы [ 4 ]

10 голосов
/ 22 сентября 2011

Оказывается, что (хотя это не задокументировано) нам нужно обменять код на 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

3 голосов
/ 08 сентября 2011

К сожалению, у меня нет прямого ответа, но у меня есть ошибка с документацией, которую я подал на фейсбук, чтобы попытаться получить там документацию: http://bugs.developers.facebook.net/show_bug.cgi?id=20363

У меня похожая проблема: когда я пытаюсь декодировать подписанный запрос из authResponse файла FB.login, его полезная нагрузка содержит что-то вроде:

{"algorithm":"HMAC-SHA256","code":"THE_CODE_HERE","issued_at":1315433244,"user_id":"THE_USER_ID"}

Как вы заявили, в документах рассказывается о том, как превратить этот код в access_token. Похоже, что это в документации "Server Side" здесь: http://developers.facebook.com/docs/authentication/

Если вы возьмете accessToken из FB.login, вы можете получить его из js и кэшировать его, но, как вы сказали, это на самом деле не подписано и может быть относительно легко подделано.

И вы правы, здесь, похоже, нет полезной информации, описанной здесь: developers.facebook.com/docs/authentication/signed_request/ (http удалено, так как у меня пока недостаточно очков репутации разместить более 2 ссылок - извините)

Возможно, вы можете проголосовать за мою ошибку? Я также опубликую эту ссылку на эту ошибку.

0 голосов
/ 26 августа 2011

fbsr_APP_ID cookie на самом деле является подписанным запросом, ознакомьтесь с официальными документами Facebook, как вы декодируете подписанный запрос, проверяете подпись и получаете информацию о пользователе.Вы также можете посмотреть на официальном источнике php SDK, откуда они получают токен доступа.

0 голосов
/ 26 августа 2011

Вы должны использовать код, чтобы получить действительный токен доступа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...