35

春の UriComponentsBuilder を使用して、oauth インタラクション用の URL を生成しようとしています。クエリ パラメータには、コールバック URL やスペースを含むパラメータ値などのエンティティが含まれます。

UriComponentBuilder を使用しようとしています (UriUtils は非推奨になったため)

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();

残念ながら、スコープ パラメータのスペースは「+」に正常に置き換えられますが、redirect_uri パラメータは URL エンコードされていません。

例えば、

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

終わるべきだった

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

しかし無傷でした。コードの詳細、具体的には org.springframework.web.util.HierarchicalUriComponents.Type.QUERY_PARAM.isAllowed(c) :

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

':' と '/' の文字を明確に許可しますが、これは許可されるべきではありません。他のタイプのエンコーディングを行っているに違いありませんが、私の人生では、何を想像することはできません。ここで間違ったツリーを吠えていますか?

ありがとう

4

4 に答える 4