javascript - URLSearchParams ile Yüzde Kodlamasını Önleme


URL oluşturmayı biraz daha basit hale getirmek için Node URL ve URLSearchParams API'lerini kullanmaya çalışıyorum. Bunu şu şekilde bir URL oluşturmak için kullanıyorum:

https://<ye olde oauth host>/oauth/authorize?response_type=code&client_id=<my client id>&redirect_uri=https://localhost:4200&scopes=scope1%20scope2

Ancak, aşağıdaki kodum URL'yi şöyle oluşturuyor:

https://<ye olde oauth host>/oauth/authorize?response_type=code&client_id=<my client id>&redirect_uri=https%3A%2F%2Flocalhost%3A4200&scopes=scope1%20scope2

Anladığım kadarıyla URLSearchParams API'si dizeleri yüzde kodlamasıyla kodlayacak, ama onları kodlamak istemezsem, örneğin URL'ler gibi, ne olur? İşte benim kodum:

const loginURL = new URL('https://<ye olde oauth host>');
    url.pathname = 'oauth/authorize';
    url.search = new URLSearchParams({
      response_type: 'code',
      client_id: '<my client id>'
    }).toString();
loginURL.searchParams.append('redirect_uri', redirectURI);
loginURL.searchParams.append('scopes', scopes);

Yeniden yönlendirme URI'sinin yüzde kodlamalı olmasını istememin nedeni, alıcı taraftaki OAuth API'sinin bunu nasıl çözeceğini bilmemesidir. URLSearchParams kullanarak bunu kodlamayı durdurmanın herhangi bir yolu var mı?

Cevap #1

Benzer bir sorun yaşamıştım. Bazı yüzde işaretleri bir token göndermemde sorun çıkarıyordu (token doğru şekilde çözümlenemiyordu). Sonunda isteğin gönderilmesinden hemen önce sadece decodeURIComponent(url) kullandım.

Cevap #2

Tarayıcı spesifikasyonunda açıklandığı gibi, hem URL hem de URLSearchParams, URL oluştururken parametre verilerini kodlar (biraz farklı kodlama kuralları kullanarak).

URLSearchParams'ten kodlanmamış parametre değerlerini almanın bildiğim tek yolu, belirli bir parametre değerini aramaktır (.get, .forEach veya benzer bir yöntem kullanarak). Örneğin:

const params = new URLSearchParams({
  redirect_uri: 'https://localhost:4200&scopes=scope1 scope2'
});

params.toString();
// Returns encoded: 'redirect_uri=https%3A%2F%2Flocalhost%3A4200%26scopes%3Dscope1+scope2'

params.get('redirect_uri');
// Returns unencoded: 'https://localhost:4200&scopes=scope1 scope2'

Bunu kendi URL'lerinizi manuel olarak oluşturmak için kullanabilirsiniz ama bu, bu API'lerin amacını bir anlamda bozar.

Bazı karakterler URL'yi geçersiz kılar ve onları kodlamanın önüne gerçekten geçemezsiniz. İşte geçerli URL'ler ve kodlamalar hakkında bazı iyi belgeler.

Şifrelenmemiş bir URL oluşturmuş olsanız bile, isteği yapmaya gittiğinizde, fetch (ve diğer fetch-benzeri kütüphaneler) genellikle bunu sizin için otomatik olarak kodlayacaktır.

Artı tarafı, birçok sunucu çerçevesi arama parametrelerinin kodlanmasını bekler ve onları aldığında parametreleri otomatik olarak çözer. Eğer OAuth servisiniz bunu zaten yapmıyorsa, muhtemelen yapmalıdır!

İlgili makaleler