Temel HTTP ve Taşıyıcı Belirteci Kimlik Doğrulaması


115

Şu anda geliştirme ortamı için HTTP-Temel korumalı bir REST-API geliştiriyorum. Gerçek kimlik doğrulama bir belirteç aracılığıyla yapıldığından, hala iki yetkilendirme başlığının nasıl gönderileceğini anlamaya çalışıyorum.

Bunu denedim:

curl -i http://dev.myapp.com/api/users \
  -H "Authorization: Basic Ym9zY236Ym9zY28=" \
  -H "Authorization: Bearer mytoken123"

Örneğin IP'm için HTTP Kimlik Doğrulamasını devre dışı bırakabilirim, ancak genellikle dinamik IP'lerle farklı ortamlarda çalıştığım için bu iyi bir çözüm değil. Yani bir şey mi kaçırıyorum?


2
Dev sunucusu onunla korunduğundan ve API için belirteç tabanlı kimlik doğrulamasına ihtiyacım olduğu için HTTP Basic aracılığıyla kimlik doğrulamam gerekiyor. Ancak API'yi test etmek için curl kullandığım için, her iki kimlik doğrulama başlığını da göndermek için bir yola ihtiyacım var. Dolayısıyla, HTTP Basic'i geçiren ilki (temel) ve uygulamamın kimliğini doğrulamak için ikincisi (belirteç). Ve evet, bu benim kendi eserim.
Azngeek

1
Bunu hiç çözdün mü? Bir ödül ekliyorum
Adam Waite

4
Merhaba Adam, maalesef hayır. Şimdi belirteç için Yetkilendirme Başlığımı standart bir başlık olmayan "x-auth" olarak değiştirerek kimlik doğrulamanın çalışma şeklini değiştirdim.
Azngeek

1
Nginx sunucum 2 Yetkilendirme başlığını bile kabul etmiyor. Bir 400 Bad request. Aptal.
Rudie

1
API simgeniz için özel bir başlık kullanmanın nesi yanlış? Geliştirme / hazırlama sunucularını meraklı gözlerden uzak tutmak için buradaki insanların neden HTTP Temel Kimlik Doğrulamasını kullanarak "hurdaya çıkardıklarını" anlamıyorum.
Sunil D.

Yanıtlar:


68

Url'de temel kimlik doğrulamasını göndermek için bunu deneyin:

curl -i http://username:password@dev.myapp.com/api/users -H "Authorization: Bearer mytoken123"
               ^^^^^^^^^^^^^^^^^^

Yukarıdakilerden biri işe yaramazsa, onunla hiçbir ilginiz yoktur. Bu yüzden aşağıdaki alternatifleri deneyin.

Jetonu başka bir isim altında geçirebilirsiniz. Çünkü uygulamanızdan yetkilendirme yapıyorsunuz. Böylece bu esnekliği bu özel amaç için kolayca kullanabilirsiniz.

curl -i http://dev.myapp.com/api/users \
  -H "Authorization: Basic Ym9zY236Ym9zY28=" \
  -H "Application-Authorization: mytoken123"

Başlığı olarak değiştirdiğime dikkat edin Application-Authorization. Böylece, uygulamanızdan bu başlığın altındaki jetonu yakalayın ve yapmanız gerekenleri işleyin.

Yapabileceğiniz diğer bir şey tokende POSTparametrelerin üzerinden geçmek ve parametrenin değerini Sunucu tarafından almaktır. Örneğin curl post parametresiyle belirteç iletmek:

-d "auth-token=mytoken123"

1
Merhaba Sabuj, sorun kullanıcı adı ve şifreyi nasıl geçirdiğiniz değil, ancak çoklu yetkilendirme başlıkları çalışmıyor. Spesifikasyonlara ( ietf.org/rfc/rfc2617.txt ) bakarak bunun mümkün olması gerektiğini görebiliyorum. Ancak aynı zamanda belirtildiği gibi "" Kullanıcı aracısı, anladığı en güçlü kimlik doğrulama şemasına sahip zorluklardan birini kullanmayı SEÇMELİDİR ve bu zorluğa dayanarak kullanıcıdan kimlik bilgileri talep etmelidir. "Bu nedenle, 2 gün önce yazdığım gibi, geçmem gerekiyordu. standart olmayan mimarilerle
uğraşırken

5
@Azngeek Curl, görevi gerçekleştirdiğinizde her iki yetkilendirme başlığını da gönderir. Bunu sunucunuzun ucundan halletmeniz gerekiyor. Curl komutunuzu her iki başlıkta -vparam ile çalıştırın . Gönderdiğini Authorization: Basic Ym9zY236Ym9zY28=, Authorization: Bearer mytoken123istek başlığında bulacaksınız . Sunucunuzun ucundan, işaretlerseniz, bu şekilde Authorization: Basic Ym9zY236Ym9zY28=, Bearer mytoken123virgülle ayrılmış Yetkilendirme başlığınızın olduğunu göreceksiniz . Öyleyse, size alternatifler önermem gerektiğini düşünüyorum.
Sabuj Hassan

34

Standart ( https://tools.ietf.org/html/rfc6750 ) şunları kullanabileceğinizi söylüyor:

  • Form Kodlu Gövde Parametresi: Yetki: Bearer mytoken123
  • URI Sorgu Parametresi: access_token = mytoken123

Dolayısıyla, URI ile birçok Taşıyıcı Token'ı geçirmek mümkündür, ancak bunu yapmak önerilmez (standartta bölüm 5'e bakın).


4

Arada nginx gibi bir ters proxy kullanıyorsanız, gibi özel bir belirteç tanımlayabilirsiniz X-API-Token.

Nginx'te, yukarı akış proxy'si (kalan api'niz) yalnızca kimlik doğrulaması için yeniden yazarsınız:

proxy_set_header Authorization $http_x_api_token;

... nginx, HTTP AUth'u kontrol etmek için orijinal Yetkilendirme başlığını kullanabilir.


3

Benzer bir sorun yaşadım - cihazda ve cihazda kullanıcı kimliğini doğrulayın. Bir Cookiebaşlığın yanında bir Authorization: Bearer...başlık kullandım.


Neden olumsuz oy verildiği belli değil. Bu soruyla ilgili bir soruna cevap ararken karşılaştım - bu şekilde çözdüm. CookieBaşlık zaten sık kimlik doğrulaması için kullanılır.
Iiridayn

2

curl --anyauth

Curl'e kimlik doğrulama yöntemini kendi başına bulmasını ve uzak sitenin desteklediğini iddia ettiği en güvenli yöntemi kullanmasını söyler. Bu, ilk önce bir istek yaparak ve yanıt başlıklarını kontrol ederek, dolayısıyla muhtemelen fazladan bir ağ gidiş-dönüşü tetikleyerek yapılır. Bu, --basic, --digest, --ntlm ve --negotiate ile yapabileceğiniz belirli bir kimlik doğrulama yöntemi ayarlamak yerine kullanılır.


1

Geliştirme sunucusunda API'leri test etmek için başka bir çözüm var.

  • HTTP Basic AuthenticationYalnızca web rotaları için ayarla
  • Tüm API yollarını kimlik doğrulamasından arındırın

Web sunucusu yapılandırması nginxve Laravelbunun gibi olacaktır:

    location /api {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location / {
        try_files $uri $uri/ /index.php?$query_string;

        auth_basic "Enter password";
        auth_basic_user_file /path/to/.htpasswd;
    }

Authorization: Bearer geliştirme sunucusunu web tarayıcılarına ve diğer istenmeyen ziyaretçilere karşı koruma görevini yerine getirecektir.


0

Nginx ile her iki jetonu da şu şekilde gönderebilirsiniz (standarda aykırı olsa bile):

Authorization: Basic basic-token,Bearer bearer-token

Bu, temel belirteç ilk olduğu sürece çalışır - nginx bunu başarıyla uygulama sunucusuna iletir.

Ve sonra, uygulamanızın Taşıyıcıyı yukarıdaki dizeden düzgün bir şekilde çıkarabildiğinden emin olmanız gerekir.

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.