2011-10-18 51 views
111

Bir HTTP yetkilendirme başlığına özel veriler koymak kabul edilebilir olup olmadığını merak ediyordum. Bir RESTful API tasarlıyoruz ve özel bir yetkilendirme yöntemi belirtmenin bir yoluna ihtiyacımız var. Örnek olarak, FIRE-TOKEN kimlik doğrulaması diyelim.Özel HTTP Yetkilendirme Üstbilgisi

bu spec göre geçerli olması ve izin gibi

misiniz şey : Authorization: FIRE-TOKEN 0PN5J17HBGZHT7JJ3X82:frJIUN8DYpKDtOLCwo//yllqDzg=

(daha önce ':') ikinci dizenin ilk bölümü API anahtarıdır, ikinci bölüm sorgu dizesi bir karmasıdır .

cevap

22

Ayrı, özel bir üstbilgi içine koyun.

Standart HTTP üstbilgilerinin aşırı yüklenmesi, muhtemelen değerden daha fazla karışıklığa neden olacak ve principle of least surprise. Ayrıca, yalnızca standart HTTP başlıklarının (Authorization gibi) standart formunu ele alabilen, araç dışı araç kitlerini kullanmak isteyen API istemci programcılarınız için birlikte çalışabilirlik sorunlarına yol açabilir.

+2

Bu göründüğünden daha doğru gitmek daha zor olabilir. Fumanchu'nun sağladığı bağlantı (cevabına yapılan bir yorumda), özel bir üstbilginin kullanılmasının neden artık, önbellek denetimini doğru bir şekilde manüel olarak ayarlamak zorunda kalmanın ek yükünü eklediğini açıklıyor. –

+3

Ayrıca, tarayıcı aracılığıyla çapraz kaynaklı bir istekte bulunursanız, aksi halde önleyemeyeceğiniz özel başlık nedeniyle artık uçuş öncesi bölgenizdesiniz. Belirli uygulamalar için, bu istekler eklenir. –

+17

Özel kimlik doğrulama başlıklarına büyük önem yok.Kendi özel düzeninizle birlikte standart olan "Yetkilendirme" başlığının yeterli olması gerekir. Ayrıca @wilmoore'un işaret ettiği gibi uçuş öncesi Origin isteklerinden kaçınabilirsiniz. Özel şemalar, bildiğim modern bir HTTP sunucusuna müdahale etmez, artı kendi planınızı kullanırsanız, kendiniz ayrıştırmanız gerekir - hiçbir kitaplık çakışmamalıdır (aksi takdirde kitaplık yetersiz yazılır). –

15

Hayır, bu RFC 2617'daki "kimlik bilgileri" tanımına göre geçerli bir üretim değil. Geçerli bir auth şeması verirsiniz, ancak auth-param değerleri token "=" (token | quoted-string) formunda olmalıdır (bkz. Bölüm 1.2) ve örneğiniz bu şekilde "=" kullanmaz.

+0

Bu doğru değil. Örnek bir biçim için belgenin 5. sayfasına bakın: Yetkilendirme: Temel QWxhZGRpbjpvcGVuIHNlc2FtZQ == – NRaf

+10

Bu doğrudur. Ancak, http://tools.ietf.org/html/draft-ietf-httpbis-p7-auth-16#section-2.3.1'in de belirttiği gibi, "b64token" notasyonu mevcut kimlik doğrulama şemaları ile uyumluluk için tanıtıldı ve sadece meydan okuma/kimlik bilgisi başına bir kez kullanılmalıdır.Yeni şemalar bunun yerine "auth-param" sözdizimini kullanmalıdır, çünkü aksi takdirde gelecekteki uzantılar imkansız olacaktır. " Ayrıca, özel başlıklarda kimlik doğrulama ile ilgili önbellek tartışmasına da bakın. – fumanchu

115

RFC2617'da tanımlanan biçim credentials = auth-scheme #auth-param'dur. Yani, fumanchu ile kabul de, ben düzeltilmiş yetkilendirme şeması FIRE-TOKEN şeması ve iki anahtar-değer çiftleri auth parametrelerdir olduğunu

Authorization: FIRE-TOKEN apikey="0PN5J17HBGZHT7JJ3X82", hash="frJIUN8DYpKDtOLCwo//yllqDzg=" 

gibi görünecektir düşünüyorum. Ben ... (p7-auth-19 apendiks B'den) tırnak isteğe bağlıdır

auth-param = token BWS "=" BWS (token/quoted-string) 

inanıyoruz rağmen bu, son standartlarına uygun kullanım (aşağıya bakınız) zaten ve Anahtar nedeniyle sağlar inanıyoruz Basit uzantı için değer formatı (ek parametrelere ihtiyacınız varsa). Bu auth-param sözdizimi

bazı örnekler burada ...

http://tools.ietf.org/html/draft-ietf-httpbis-p7-auth-19#section-4.4

https://developers.google.com/youtube/2.0/developers_guide_protocol_clientlogin

görülebilir

https://developers.google.com/accounts/docs/AuthSub#WorkingAuthSub

+2

[Amazon'un basit depolama API'sı] (http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-auth-using-authorization-header.html) başka bir örnek sunuyor. – bishop

8

ben, ama meraklı biliyorum Eski soru:

İster inanın ister inanmayın, bu sorun ~ 2 yıl önce HTTP BASIC, hangi passe ile çözüldü base64 olarak kodlanmış kullanıcı adı: password. Yukarıdaki örnek olacak şekilde

Sen, aynı yapabilirdi (http://en.wikipedia.org/wiki/Basic_access_authentication#Client_side bakınız):

Authorization: FIRE-TOKEN MFBONUoxN0hCR1pIVDdKSjNYODI6ZnJKSVVOOERZcEtEdE9MQ3dvLy95bGxxRHpnPQ== 
+1

Bu yanıtı şu şekilde tavsiye ederim: [burada başka bir cevap hakkında yorum başına] (https://stackoverflow.com/questions/7802116/custom-http-authorization-header#comment9522460_7809486), burada kullanılan gösterim uyumluluk içindir Mevcut planlar ile ve yeni uzantılar için önerilmez. – Whymarrh

İlgili konular