Самый умный способ разобрать строку маркера доступа OAuth 2 на Facebook - PullRequest
6 голосов
/ 13 мая 2010

Уже немного поздно, но я разочарован в себе, что не придумал что-то более элегантное. У кого-нибудь есть лучший способ сделать это ...

Когда вы передаете код OAuth в Facebook, он отвечает строкой запроса, содержащей значения access_token и expires.

access_token=121843224510409|2.V_ei_d_rbJt5iS9Jfjk8_A__.3600.1273741200-569255561|TxQrqFKhiXm40VXVE1OBUtZc3Ks.&expires=4554

Хотя, если вы запрашиваете разрешение на автономный доступ, expires нет, и строка выглядит следующим образом:

access_token=121843224510409|2.V_ei_d_rbJt5iS9Jfjk8_A__.3600.1273741200-569255561|TxQrqFKhiXm40VXVE1OBUtZc3Ks.

Я попытался написать регулярное выражение, которое было бы достаточно для любого условия. Нет кости. Так что я получил действительно ужасный Ruby:

s = s.split("=")
@oauth = {}
if s.length == 3
  @oauth[:access_token] = s[1][0, s[1].length - 8]
  @oauth[:expires] = s[2]
else
  @oauth[:access_token] = s[1]
end

Я знаю, что должен быть лучший способ!

Ответы [ 3 ]

4 голосов
/ 13 мая 2010

Сначала разделить на символ &, а затем разделить каждый из результатов на =? Это метод, который может справиться с изменением порядка, поскольку он анализирует каждую пару ключ-значение по отдельности.

В качестве альтернативы, регулярное выражение, которое должно работать, будет ...

/access_token=(.*?)(?:&expires=(.*))/
3 голосов
/ 13 мая 2010

Если формат строгий, то вы используете это регулярное выражение:

access_token=([^&]+)(?:&expires=(.*))?

Тогда access_token значение будет в \1, а expires, если оно есть, будет в \2.

0 голосов
/ 13 мая 2010

Синтаксический анализ строки запроса обычно включает в себя следующие шаги:

  1. Если это полный URL, примите участие после первого ?
  2. разделить остаток на &
  3. для каждой из полученных name=value пар, разделите их на =
  4. URL-декодирование на value и на name (!)
  5. вставьте результат в структуру данных по своему вкусу

Использование регулярного выражения возможно, но делает недопустимые предположения о состоянии кодирования URL, в котором находится строка, и завершается ошибкой, если изменяется порядок строки запроса, что совершенно допустимо и поэтому не может быть исключено. Лучше инкапсулировать вышеперечисленное в небольшой функции синтаксического анализа или использовать одну из существующих библиотек обработки URL-адресов вашей платформы.

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