- Konu sahibi
- #1
WordPress REST API yetki hatasını teşhis etmek için önce isteğin kimlik doğrulama bilgisi taşıyıp taşımadığını, ardından kullanılan hesabın ilgili işlemi yapma iznine sahip olup olmadığını ve son olarak nonce, çerez veya Uygulama Parolası gibi doğrulama bilgilerinin doğru gönderildiğini kontrol edin.
Önce HTTP durum koduna değil, JSON yanıtındaki
İsteğin gerçekten hangi yanıtı verdiğini görmek için gövdeyi ve başlıkları birlikte inceleyin:
Bu ilk POST örneği kimlik doğrulama göndermediği için standart çekirdekte başarılı kayıt değil401 yetki reddi beklenir; yalnız kontrollü bir test sitesinde deneyin. Geçerli kimlik ve yazı oluşturma capability’si gönderilirse yeni taslak nesnesi ve201 Created beklenir.
WordPress REST API çağrısı nereden yapıldığına göre farklı doğrulama bilgileri bekleyebilir:
Uygulama Parolasıyla yapılan en küçük test şu şekildedir:
curl parola istediğinde ilgili kullanıcı için üretilmiş Uygulama Parolasını girin; normal hesap parolasını veya sırrı komut satırında/depo içinde tutmayın. Beklenen sonuç, kimliği doğrulanan kullanıcıyı açıklayan JSON yanıtıdır.
Kimlik doğrulandıktan sonra isteğin hedef endpoint'inin ve HTTP yönteminin doğru olduğundan emin olun. Bir endpoint'in listeleme işlemi
Şu ayrım teşhisi hızlandırır:
Özel bir endpoint geliştiriyorsanız, endpoint'in
Hiç nonce gönderilmemesi cookie REST akışında kullanıcıyı anonim kabul ettirebilir; geçersiz nonce403’ü ise kimlik doğrulanmış ama capability eksik demek değildir. WAF/CDN’nin HTML403’ünü WordPress JSON hatasıyla karıştırmayın. Application Password kendi başına genişletilmiş yetki vermez; bağlı kullanıcının yetkilerini kullanır ve cookie nonce’u aynı şekilde gerektirmez. Gerçek Authorization/cookie/nonce değerlerini teşhis kaydında maskeleyin.
Nonce değerini statik olarak saklamak, nonce'u çerez olmadan göndermek ve normal WordPress parolasını uygulama koduna yazmak en yaygın hatalardır. Ayrıca
401 çoğunlukla kimlik doğrulama eksikliği veya başarısızlığına, 403 ise kimliği bilinen kullanıcının işlemi yapmaya yetkisinin olmamasına işaret eder.Hata yanıtını okuyarak başlayın
Önce HTTP durum koduna değil, JSON yanıtındaki
code, message ve varsa data alanlarına bakın. Örneğin rest_not_logged_in oturum bilgisinin ulaşmadığını, rest_cookie_invalid_nonce gönderilen nonce’un geçersiz olduğunu (çekirdekte403), rest_cannot_create ya da rest_forbidden ise işlemin mevcut kullanıcı için engellendiğini gösterir.İsteğin gerçekten hangi yanıtı verdiğini görmek için gövdeyi ve başlıkları birlikte inceleyin:
Kod:
curl -i -X POST 'https://example.com/wp-json/wp/v2/posts' \
-H 'Content-Type: application/json' \
--data '{"title":"Deneme","status":"draft"}'
Bu ilk POST örneği kimlik doğrulama göndermediği için standart çekirdekte başarılı kayıt değil401 yetki reddi beklenir; yalnız kontrollü bir test sitesinde deneyin. Geçerli kimlik ve yazı oluşturma capability’si gönderilirse yeni taslak nesnesi ve201 Created beklenir.
401 veya 403 alıyorsanız, henüz içerik verisini değiştirmeden kimlik doğrulama ve izin adımlarını kontrol edin.Kimlik doğrulama türünü ayırın
WordPress REST API çağrısı nereden yapıldığına göre farklı doğrulama bilgileri bekleyebilir:
- Ziyaretçinin tarayıcısındaki giriş oturumu ile çağrı yapıyorsanız, WordPress oturum çereziyle birlikte geçerli bir
X-WP-Noncebaşlığı gönderin. Nonce, kullanıcının oturum açmış olmasını tek başına sağlamaz; mevcut oturumu doğrulayan çerez de isteğe ulaşmalıdır. - Harici bir komut satırı aracı veya sunucu uygulaması kullanıyorsanız, kullanıcı hesabı için oluşturulmuş Uygulama Parolasını temel kimlik doğrulama başlığıyla gönderin. Normal hesap parolasını kod içine koymayın.
- Kullandığınız özel JWT, OAuth veya başka bir eklenti tabanlı yöntemin gerçekten etkin olduğunu ve ilgili başlık biçimini doğrulayın. WordPress çekirdeği, her özel doğrulama yönteminin başlığını kendiliğinden kabul etmez.
Uygulama Parolasıyla yapılan en küçük test şu şekildedir:
Kod:
curl -i 'https://example.com/wp-json/wp/v2/users/me' \
--user 'api-kullanici'
curl parola istediğinde ilgili kullanıcı için üretilmiş Uygulama Parolasını girin; normal hesap parolasını veya sırrı komut satırında/depo içinde tutmayın. Beklenen sonuç, kimliği doğrulanan kullanıcıyı açıklayan JSON yanıtıdır.
401 alırsanız parola, kullanıcı adı, HTTPS aktarımı veya sunucunun Authorization başlığını PHP/WordPress'e iletmesi incelenmelidir. 200 alıp yazı oluşturma isteğinde 403 alırsanız kimlik doğrulama çalışıyor, ancak hesabın ilgili yetkisi yoktur.İzin ve endpoint kontrolü
Kimlik doğrulandıktan sonra isteğin hedef endpoint'inin ve HTTP yönteminin doğru olduğundan emin olun. Bir endpoint'in listeleme işlemi
GET ile çalışırken oluşturma, güncelleme veya silme için POST, PUT ya da DELETE ve ayrıca daha yüksek izin gerekebilir. Kullanıcı /wp-json/wp/v2/users/me çağrısını okuyabilir; bu, otomatik olarak yazı yayımlayabileceği anlamına gelmez.Şu ayrım teşhisi hızlandırır:
| Belirti | Muhtemel neden | Sonraki kontrol |
|---|---|---|
| 401 ve giriş gerekli mesajı | Çerez veya kimlik doğrulama başlığı yok | İsteğin başlıklarını ve sunucuya ulaşmasını kontrol edin |
| 403 ve rest_cookie_invalid_nonce | Nonce yanlış, süresi dolmuş veya başka oturuma ait | Nonce'u aynı oturumdan yeniden alın |
| 403 yetki reddedildi | Kullanıcı kimliği biliniyor fakat capability eksik | Rolü, özel rol yetkisini ve endpoint kuralını inceleyin |
| 404 endpoint bulunamadı | Yanlış yol, devre dışı eklenti veya kayıt edilmemiş route | Route listesini ve eklenti durumunu kontrol edin |
Özel bir endpoint geliştiriyorsanız, endpoint'in
permission_callback kuralını da inceleyin. Bu kural her isteği yanlışlıkla reddedebilir veya yalnızca giriş yapılmış olmayı yeterli sanabilir. İzin kontrolü, yapılacak eylem için gereken capability'yi değerlendirmelidir.Uygulanabilir teşhis sırası
- Aynı isteği önce
GET /wp-json/veya kimlik doğrulama gerektirmeyen bilinen bir endpoint ile çalıştırarak REST API'nin genel olarak erişilebilir olduğunu test edin. - İstek yanıtındaki durum kodunu,
codevemessagealanlarını kaydedin; yalnızca tarayıcının gösterdiği genel hata metnine güvenmeyin. - Kimlik doğrulamayı ayrı olarak
/wp-json/wp/v2/users/meile test edin. Bu adım başarısızsa içerik oluşturma isteğini incelemeye geçmeyin. - Kimlik doğrulama başarılıysa aynı kullanıcıyla önce okuma, sonra oluşturma veya güncelleme isteğini deneyin. Fark, eksik capability ya da endpoint iznini gösterir.
- Tarayıcı çağrısında çerez ve nonce'un aynı oturuma ait olduğunu; harici çağrıda ise
Authorizationbaşlığının sunucuya ulaştığını kontrol edin. - Sorun yalnızca özel route'ta görülüyorsa route kaydı, HTTP yöntemi,
permission_callbackve eklentinin rol yetkilerini birlikte inceleyin.
Hiç nonce gönderilmemesi cookie REST akışında kullanıcıyı anonim kabul ettirebilir; geçersiz nonce403’ü ise kimlik doğrulanmış ama capability eksik demek değildir. WAF/CDN’nin HTML403’ünü WordPress JSON hatasıyla karıştırmayın. Application Password kendi başına genişletilmiş yetki vermez; bağlı kullanıcının yetkilerini kullanır ve cookie nonce’u aynı şekilde gerektirmez. Gerçek Authorization/cookie/nonce değerlerini teşhis kaydında maskeleyin.
Sık yapılan hatalar
Nonce değerini statik olarak saklamak, nonce'u çerez olmadan göndermek ve normal WordPress parolasını uygulama koduna yazmak en yaygın hatalardır. Ayrıca
403 yanıtını her zaman “şifre yanlış” diye yorumlamak yanlıştır; çoğu durumda kullanıcı tanınmış, fakat istenen işlem için yetkisi yetersizdir. Güvenlik eklentileri veya sunucu kuralları da REST isteklerini engelleyebilir. Bunu ayırt etmek için aynı kimlik doğrulama testiyle yalnızca belirli endpoint'in mi, yoksa tüm REST isteklerinin mi başarısız olduğunu karşılaştırın.Kaynaklar
Sık sorulan sorular
Nonce ile Uygulama Parolası aynı şey midir?
Hayır. Nonce, oturum açmış tarayıcı isteğini koruyan kısa ömürlü bir doğrulama değeridir. Uygulama Parolası ise harici uygulamanın kullanıcı hesabı adına kimlik doğrulaması yapması için kullanılan ayrı bir bilgidir.GET çalışırken POST neden yetki hatası veriyor?
GET çoğunlukla okuma yetkisi ister; POST ise oluşturma veya değiştirme yetkisi gerektirir. Hesabın rolü, ilgili capability ve endpoint'in izin kuralı POST için yeterli olmayabilir.Özel endpoint'te her zaman 403 alıyorsam nereye bakmalıyım?
Önce endpoint'inpermission_callback işlevini ve döndürdüğü değeri kontrol edin. Ardından route'un gerçekten yüklendiğini, beklenen HTTP yöntemini kullandığınızı ve kontrol edilen capability'nin kullanıcı rolünde bulunduğunu doğrulayın.