2010-05-13 13 views
6

Trochę za późno, ale jestem rozczarowany tym, że nie wymyśliłem czegoś bardziej eleganckiego. Każdy ma lepszy sposób na zrobienie tego ...Najbardziej sprytny sposób na przetestowanie dostępowego tokenu dostępu OAuth 2 na Facebooku

Po przesłaniu kodu OAuth do Facebooka, odpowiedź zawiera ciąg zapytania zawierający wartości access_token i expires.

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

Chociaż jeśli wniosek o pozwolenie na dostęp w trybie offline, nie ma expires i ciąg wygląda następująco:

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

próbowałem napisać regex, że wystarczyłoby dla każdej kondycji. Nie ma kości. Więc skończyło się na naprawdę brzydkim 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 

Wiem, że musi być lepszy sposób!

Odpowiedz

3

Jeśli format jest surowy, a następnie użyć tego wyrażenia regularnego:

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

Następnie access_token wartość jest w \1 i expires, jeśli jest, będzie w \2.

+0

W kwestii ścisłości, tak, działa tak długo, jak "&" nigdy nie jest częścią tokena dostępu. Nie jestem pewien, czy to bezpieczne założenie. Nie można znaleźć niczego w specyfikacji do sprawdzenia poprawności. –

4

Najpierw podziel symbol &, a następnie podziel każdy z wyników na =? Jest to metoda, która może poradzić sobie ze zmianą zamówienia, ponieważ analizuje każdą parę klucz-wartość indywidualnie.

Alternatywnie, regex, który powinien działać będzie ...

/access_token=(.*?)(?:&expires=(.*))/ 
+0

To ten, z którym bawiłam się. Zawodzi, gdy "& expires =" nie występuje w łańcuchu. –

+2

Hm, to źle to zaimplementujesz - nie powinieneś jawnie odwoływać się do indeksów, ale zamiast tego patrzeć na klucz, który wychodzi z pierwszej części każdego podziału "=". Jak w, 'a = s.split (" & ")', następnie dla każdej wartości w 'a',' p = a.split ("=") ', a następnie sprawdź, co' p [0] 'jest równe najpierw dla nazwy klucza, a następnie przypisz 'p [1]' do właściwej zmiennej na podstawie klucza. To nie powinno mieć znaczenia, co jest w twojej strunie. To jest cała zaleta używania 'split' w pierwszej kolejności. – Amber

+0

Twój kod w OP również dzieli się na '=', a nie 'i' first. – Amber

0

Query ciąg parsowanie zazwyczaj obejmuje kroki:

  1. Jeśli jest to pełny adres URL, wziąć udział po raz pierwszy ?
  2. podzielić resztę na &
  3. dla każdego z powstałych name=value parach , podzielić je na =
  4. URL dekodowania do valueiname (!)
  5. rzeczy wynik do struktury danych własnych upodobań

przy użyciu regex jest możliwe, ale sprawia, że ​​nieprawidłowe założenia dotyczące stanu URL kodujący łańcuch jest i nie działa, jeśli kolejność zmian ciąg kwerendy który jest całkowicie dozwolony i dlatego nie można go wykluczyć. Lepiej zamknąć powyższe elementy w małej funkcji parsowania lub użyć jednej z istniejących bibliotek obsługi URL dla twojej platformy.

Powiązane problemy