2013-08-08 20 views
15

Próbuję użyć Spring's UriComponentsBuilder do generowania adresów URL dla interakcji oauth. Parametry zapytania zawierają takie elementy, jak adresy URL wywołania zwrotnego i wartości parametrów ze spacjami.Kodowanie adresu URL przy użyciu nowej wersji Spring UriComponentsBuilder

Próba użycia UriComponentBuilder (bo UriUtils jest teraz przestarzała)

UriComponentsBuilder urlBuilder = UriComponentsBuilder.fromHttpUrl(oauthURL); 
urlBuilder.queryParam("client_id", clientId); 
urlBuilder.queryParam("redirect_uri", redirectURI); 
urlBuilder.queryParam("scope", "test1 test2"); 

String url = urlBuilder.build(false).encode().toUriString(); 

Niestety, podczas gdy przestrzeń w parametrze zakres jest z powodzeniem zastąpić „+”, parametr redirect_uri wcale nie jest zakodowany w adresie URL.

Np,

redirect_uri=https://oauth2-login-demo.appspot.com/code 

powinien skończyło się

redirect_uri=https%3A%2F%2Foauth2-login-demo.appspot.com%2Fcode 

ale był nietknięty. Nurkowanie na kod, w szczególności org.springframework.web.util.HierarchicalUriComponents.Type.QUERY_PARAM.isAllowed (C):

if ('=' == c || '+' == c || '&' == c) { 
    return false; 
} 
else { 
    return isPchar(c) || '/' == c || '?' == c; 
} 

wyraźnie pozwala ':' i postacie '/', który z gumy, to shouldn” t. Musi robić jakiś inny rodzaj kodowania, choć nie potrafię sobie wyobrazić co z mojego życia. Czy wyrzucam złe drzewa?

Dzięki

Odpowiedz

15

UriComponentsBuilder jest zakodowanie URI zgodnie z RFC 3986 (patrz http://www.ietf.org/rfc/rfc3986.txt, w szczególności sekcji 3.4, który jest o „zapytań” składnik URI).

W składniku "zapytanie" znaki "/" i ":" są dozwolone i nie wymagają ucieczki.

Aby użyć znaku "/", na przykład: "element zapytania" (który jest wyraźnie oddzielony znakami "?" I (opcjonalnie) "#" bez znaku, nie jest hierarchiczny, a znak "/" nie ma specjalne znaczenie. Więc nie wymaga kodowania.

+0

To nie jest poprawne, ponieważ '&' i inne znaki o znaczeniu również nie są chronione. UriComponentsBuilder nie koduje adresu URL parametru zapytania. –

+0

@Adam Millerchip, nie rozumiem - z pewnością i tak się ucieknę.OP wkleił fragment kodu pokazujący, że & nie jest dozwolony, ani nie jest = lub +. Wszystkie te zostaną uciec. – simonh

+0

Myślisz, że tak, ale tak nie jest. Spróbuj i zobacz. –

6

z tego co rozumiem, UriComponentsBuilder nie koduje parametry zapytania automatycznie, tylko oryginalny HttpUrl to instancja z. Innymi słowy, trzeba jeszcze wyraźnie zakodować:

String redirectURI= "https://oauth2-login-demo.appspot.com/code"; 
urlBuilder.queryParam("redirect_uri", URLEncoder.encode(redirectURI,"UTF-8")); 
+1

Cóż ... Metoda "kodowania" stwierdza: koduje wszystkie składniki URI przy użyciu ich określonych reguł kodowania i zwraca wynik jako nową instancję {@code UriComponents}. Wydaje się to sugerować, że ma kodowanie URL. Wydaje się, że pozostawia to "Type" (w tym przypadku Type.QUERY_PARAM), aby zdecydować, które znaki zakodować. Więc zakoduje niektóre postacie .. ale nie niektóre bardzo ważne. Co robi metoda kodowania, jeśli nie koduje się parametrów zapytania dla kodowania URL? – ticktock

+0

koduje * adres URL *, który mu przekazujesz, ale nie każdy parametr zapytania – Black

+7

Cóż .. to nie jest bardzo przydatne. To dziwne, ponieważ jest to narzędzie do budowania adresów URL i dodajesz parametry zapytań, WTEDY kompiluj i WTEDY koduj. Zakładałbym, że buduje mi bezpieczny adres URL. Jaki jest sens dodawania parametrów zapytań, jeśli nie są one zakodowane za pomocą adresu URL? – ticktock

Powiązane problemy