Самый умный способ проанализировать строку маркера доступа Facebook OAuth 2

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

Когда Вы передаете код 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.

Я попытался записать regex, который будет достаточен для любого условия. Провал. Таким образом, я закончил с некоторым действительно ужасным 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

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

6
задан chipotle_warrior 13 May 2010 в 08:03
поделиться

3 ответа

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

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

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

3
ответ дан 17 December 2019 в 00:05
поделиться

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

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

/access_token=(.*?)(?:&expires=(.*))/
4
ответ дан 17 December 2019 в 00:05
поделиться

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

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

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

0
ответ дан 17 December 2019 в 00:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: