RESTful Oturum Açma Hatası: 401'i Döndür veya Özel Yanıt


103

Bu kavramsal bir sorudur.

RESTful web hizmetine karşı oturum açma eylemini desteklemesi gereken bir istemci (mobil) uygulamam var. Web hizmeti RESTful olduğundan, bu, istemcinin kullanıcıdan bir kullanıcı adı / şifre kabul etmesi, bu kullanıcı adını / şifreyi hizmetle doğrulaması ve ardından sadece bu kullanıcı adını / şifreyi sonraki tüm isteklerde göndermeyi hatırlaması anlamına gelir.

Bu web hizmetindeki diğer tüm yanıtlar JSON biçiminde sağlanır.

Soru, web hizmetini yalnızca belirli bir kullanıcı adının / şifresinin geçerli olup olmadığını öğrenmek için sorguladığımda, web hizmeti her zaman JSON verilerinin bana başarılı veya başarısız olduğunu söyleyerek yanıt verip vermeyeceği veya iyi kimlik bilgileri ve HTTP için HTTP 200 döndürmesi mi gerektiğidir. 401 hatalı kimlik bilgilerinde.

Sormamın nedeni, diğer bazı RESTful hizmetlerinin, yalnızca kimlik bilgilerinin geçerli olup olmadığını sorduğunuzda bile kötü kimlik bilgileri için 401 kullanmasıdır. Ancak, benim 401 yanıtlarından anladığım kadarıyla, geçerli kimlik bilgileri olmadan erişiminizin olmaması gereken bir kaynağı temsil ediyorlar. Ancak oturum açma kaynağına herkesin erişebilmesi GEREKİR çünkü oturum açma kaynağının tüm amacı, kimlik bilgilerinizin geçerli olup olmadığını size söylemektir.

Başka bir deyişle, bana öyle geliyor ki:

myservice.com/this/is/a/user/action 

Kötü kimlik bilgileri sağlanırsa 401 döndürmelidir. Ancak şöyle bir istek:

myservice.com/are/these/credentials/valid

o belirli URL (istek) geçerli kimlik bilgileriyle veya bunlar olmadan yetkilendirildiği için hiçbir zaman 401 döndürmemelidir.

Bu konuda şu ya da bu şekilde bazı haklı görüşler duymak istiyorum. Bunu halletmenin standart yolu nedir ve bunu işlemenin standart yolu mantıksal olarak uygun mudur?

Yanıtlar:


128

İlki. 401, başarısız bir oturum açma gerçekleştiğinde gönderilecek uygun yanıt kodudur.

401 Yetkilendirilmemiş 403 Yasak'a benzer, ancak özellikle kimlik doğrulaması gerektiğinde ve başarısız olduğunda veya henüz sağlanmadığında kullanım içindir. Yanıt, istenen kaynak için geçerli bir sorgulama içeren bir WWW-Authenticate başlık alanı içermelidir.

Şaşkınlığınız, myservice.com/are/these/credentials/validSadece bir kontrol yaptığınızda 401'i geri göndermekle sanırım REST'te boole istekleri yapmanın genellikle RESTful kısıtlamaları nedeniyle yanlış olduğu gerçeğine dayanıyor. Her istek bir kaynak döndürmelidir. Bir RESTful hizmetinde boolean soruları sormak, RPC'ye doğru kaygan bir sorundur.

Şimdi baktığınız hizmetlerin nasıl davrandığını bilmiyorum. Ancak bunu çözmenin iyi bir yolu, GET'e çalıştığınız bir Hesap nesnesine sahip olmaktır. Kimlik bilgileriniz doğruysa, Hesap nesnesini alırsınız, bant genişliğini sadece bir "kontrol" için harcamak istemiyorsanız, aynı kaynak üzerinde bir HEAD yapabilirsiniz.

Bir Hesap Nesnesi, aksi takdirde ayrı kaynaklar oluşturmak için zor olabilecek tüm bu sinir bozucu boole değerlerini depolamak için de güzel bir yerdir.


2
Kaynakları iade etme konusundaki düşünceniz geçerli görünüyor ve belki de buradaki doğru hareket budur. 401'in doğru yanıt olduğunu söylemeye gelince, orada biraz açıklama yapmaktan memnun olurum. Buraya eklediğiniz gibi HTTP spesifikasyonunu okudum, ancak bu bana iddianızın doğrudan ve açık bir onayı olarak okunmuyor. Yani kimlik doğrulamasının kimlik bilgilerinin geçerliliğini sorması GEREKMEZ - yine de dahil ettiğiniz şey "özellikle kimlik doğrulama gerektiğinde kullanım için" diyor.
Matt

3
Doğru bakma şekliniz. Hesap nesnenizi isteyebilmek için kimliğinizin doğrulanmasına gerek yoktur. Ancak, kaynağı alabilmek için başarılı bir şekilde kimlik doğrulaması yapmanız gerekir ve bu authentication is required and has failed or has not yet been providedgeçerli olduğunda, kimlik bilgilerinin geçerliliğini değil, sağladığınız kimlik bilgilerine göre belirli bir kaynak için sorarsınız.
Rahip

2
Neden bir "kontrol çağrısı" yapmak istediğinizi anlıyorum ve bunun için, çağrının çağrılabilir olması için kimlik doğrulamasını gerektirmese bile, 401'i başarısız bir kimlik doğrulama için uygun yanıt kodu olarak tanıtacağım. A 204 İçerik Yok da uygun olabilir, ancak biraz belirsiz hissediyor.
Rahip

4
Temel veya Özet kimlik doğrulamasını kullanmıyorsanız, bunun nasıl doğru olabileceğini anlamıyorum. Spesifikasyonun alıntılanan kısmına göre: "Yanıt bir WWW-Kimlik Doğrulaması içermelidir" - ve bölüm 14.47'ye bakarsanız: "HTTP erişim kimlik doğrulama süreci" HTTP Kimlik Doğrulaması: Temel ve Özet Erişim Kimlik Doğrulaması "bölümünde açıklanmıştır. Bana göre, tipik e-posta / şifre doğrulama kullanıyorsanız 401 uygun değil.
Jonah

1
Bunun yanlış olabileceğini düşünüyorum, hem web hem de mobil istemcileri uyguluyorum ve 401'i giriş ekranına yönlendirmek için durduruyorum. Ancak birisi zaten giriş ekranındayken ve yanlış kimlik bilgileri gönderdiğinde, yanıtta 401 de bulunur ve yeniden yönlendirmeyi dener. Açıkça denendiğinde, başarısızlıkla sonuçlanan kimlik doğrulama girişimi için farklı bir durum kodu olmalıdır. Belki kötü bir istek veya hatta sunucu hatası?
Japheth Ongeri - inkalimeva

27

401, yalnızca istek yetkilendirme başlık alanına ihtiyaç duyduğunda ve yetkilendirme başarısız olduğunda gönderilmelidir. Login API yetkilendirme gerektirmediğinden, bence 401 yanlış hata kodu

Buradaki standarda göre https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

* 10.4.2 401 Yetkisiz

İstek, kullanıcı kimlik doğrulaması gerektiriyor. Yanıt, talep edilen kaynak için geçerli bir sınama içeren bir WWW-Authenticate başlık alanı (bölüm 14.47) İÇERMELİDİR. Müşteri, talebi uygun bir Yetkilendirme başlığı alanıyla tekrarlayabilir (bölüm 14.8). Talep zaten Yetkilendirme kimlik bilgilerini içeriyorsa, 401 yanıtı bu kimlik bilgileri için yetkilendirmenin reddedildiğini gösterir. 401 yanıtı önceki yanıtla aynı sorgulamayı içeriyorsa ve kullanıcı aracısı zaten en az bir kez kimlik doğrulama girişiminde bulunduysa, kullanıcıya yanıtta verilen varlık sunulmalıdır, çünkü bu varlık ilgili teşhis bilgilerini içerebilir. HTTP erişim kimlik doğrulaması "HTTP Kimlik Doğrulaması: Temel ve Özet Erişim Kimlik Doğrulaması" [43] bölümünde açıklanmıştır. *


8
Bu konuda size katılıyorum, ancak gönderilecek alternatif yanıt durumu nedir? İstemcileri hem web hem de mobil uyguluyorum ve 401'i giriş ekranına yönlendirmek için durduruyorum. Ancak birisi zaten giriş ekranındayken ve yanlış kimlik bilgileri gönderdiğinde, yanıtta 401 de var ve yeniden yönlendirmeye çalışacak ... ne yapardınız?
Japheth Ongeri - inkalimeva

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.