API Ağ Geçidine erişirken Kimlik Doğrulama Jetonu mu eksik?


86

AWS API Gateway aracılığıyla bir Lambda İşlevi çağırmaya çalışıyorum. Authentication type NONE dediğimde iyi çalışıyor ancak API herkese açık hale geliyor ve url'ye sahip herkes API'ma erişebiliyor. API çağrısını güvenli hale getirmek için, Kimlik Doğrulama türü AWS_IAM kullanıyorum ve ayrıca kullanıcıma AmazonAPIGatewayInvokeFullAccess ilkesini ekledim ancak şu hatayı alıyorum:

{ message: "Missing Authentication Token"}

Burada neyi kaçırdığımı bilmiyorum.


Buradaki yanıtların tümü olmasa da çoğunun, belirli bir API Ağ Geçidi Kaynağı uç noktasının arkasında eşlenen diğer AWS Hizmeti (yani DynamoDB) için de işe yarayacağına inanıyorum. Bunun doğru olduğunu varsayarsak, API Gateway buradaki işletim arabirimidir (AWS Service Resource değil).
cellepo

Hata, yanlış uç noktaya
ulaşmanın

Yanıtlar:


45

Doğrudan API bağlantısına erişmeye çalıştığınızı düşünüyorum, bu işe yaramaz çünkü API, IAM rolü kullanılarak güvenli hale getirilir ve AWS kimlik doğrulaması, yani Erişim anahtarı ve Gizli anahtar sağlamanız gerekir.

API'nizi test etmek için Postman Chrome uzantısını kullanın: http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-use-postman-to-call-api.html


Merhaba Saddam, SOAP kullanıcı arayüzünde AWS kimlik doğrulaması nasıl yapılabilir. POSTMAN'da çok kolay. SOAP UI'de benzer bir yolumuz var mı?
Pankaj Sharma

173

Aptalca bir nedenden dolayı biraz zaman kaybettim:

Bir aşama oluşturduğunuzda, görüntülenen bağlantı URL'nin kaynak kısmını içermez:

API URL'si: https://1111.execute-api.us-east-1.amazonaws.com/dev

API + KAYNAK URL'si https://1111.execute-api.us-east-1.amazonaws.com/dev/get-list

/ Get-liste eksikti

Ve elbette, yöntem yapılandırmasının aşağıdaki gibi görünüp görünmediğini kontrol etmeniz gerekir:

görüntü açıklamasını buraya girin


14
Bir sorunun saçma (ancak yaygın) nedenlerini kabul etmek için özel tebrikler gereklidir. Bu beni de aldı.
Jeff Richards

Maalesef, ne demek istediğini anlamadım, Bir gönderi isteğinin kimlik doğrulamasını kullanacak şekilde ayarlanıp ayarlanmadığını kontrol etmek istiyorsanız, oluşturduğunuz kaynağın altındaki POST seçeneğine tıklamanız gerekir, örneğin, / my- kaynaklarınızda arama sonrası ve onun altında OPTION ve POST yöntemleriniz var. POST'a tıklayın ve ardından yöntem yapılandırmasında kimlik doğrulamanın gerekli olup olmadığını görebilirsiniz. Ancak tam URL'yi bir posta çağrısına almak istiyorsanız, API URL'si + KAYNAK alma ile aynı şekilde çalışır, örneğin, 1111.execute-api.us-east-1.amazonaws.com/dev/my- pos-tcall
Carlos Alberto Schneider

2
Beni heyecanlandıran ilgili, aptalca bir şey: HTTP fiilinizin doğru olduğundan emin olun. Yanlışlıkla POST yerine GET gönderiyordum. Bu hatayı hem yol hem de fiil açısından tam olarak eşleşmeyen herhangi bir rotada alacaksınız .
Josh1billion

Çok teşekkürler !! Bahsettiğinizde çok basit. Fark etmedim Teşekkür ederim dostum!
ylev

FWIW, İlk olarak Aşamalar ağacında Kaynağın kendisine (bu durumda GET) tıklayarak o kaynağın tam URL'sini doğrudan göstermesi gerektiğine inanıyorum. İlgili
Cevabımda

21

Aynı sorunu yaşadım ve kaynak bulunamazsa bu mesajı da gösteriyor gibi görünüyor.

Benim durumumda API'yi güncelledim, ancak yeniden dağıtmayı unuttum. Güncellenen API aşamama dağıtıldıktan sonra sorun çözüldü.


Ben böyle çalıştırdım. Kaynağı yeniden konuşlandırdı !.
KQI

8

Görünüşe göre (Nisan 2019 itibarıyla) AWS API Gateway bu istisnayı çeşitli nedenlerden dolayı atıyor - çoğunlukla API Gateway'in dağıtılmadığı için ulaşamadığı bir uç noktaya ulaştığınızda ya da belirli durumlarda HTTP yöntemi desteklenmez.

Ağ geçidinin, genel bir HTTP 403 Yasak yerine HTTP 405 Yöntemi desteklenmiyor veya HTTP 404 bulunamadı gibi daha uygun hata kodları göndermesini diliyorum.


8

İlk olarak Aşamalar ağacında belirli bir Kaynağa tıkladığınızdan emin olun, çünkü bu , kaynağın tam yolu ile bir URL'yi doldurur (yalnızca kök yolu yerine): görüntü açıklamasını buraya girin

Diğer nedenler için bkz. Http://www.awslessons.com/2017/aws-api-gateway-missing-authentication-token/



@sumanthshetty bu çözümü ya da buradaki yanıtların geri kalanını denediniz mi? Yoksa buradan AWS bağlantısını okudunuz mu?
cellepo

buradaki tüm cevabı ve ayrıca makaleyi
denedim

6

Kaynak oluşturduğunuzdan ve ardından içinde yöntem oluşturduğunuzdan emin olun. Benim için sorun buydu. Teşekkürler

görüntü açıklamasını buraya girin


5

Bunu dokümanlarda buldum:

AWS_IAM yetkilendirmesi kullanılmışsa, isteği İmza Sürüm 4 protokollerini kullanarak imzalarsınız.

İmza Sürüm 4 ile imzalama isteği


API'niz için bir SDK da oluşturabilirsiniz.

API Gateway'de bir API için bir SDK nasıl oluşturulur?

Seçtiğiniz platform için SDK'yı oluşturduktan sonra, 6. adımda, AWS kimlik bilgilerini kullanıyorsanız API talebinin imzalanacağından bahsedilir:

  1. API Ağ Geçidi tarafından üretilen SDK'yı AWS kimlik bilgileriyle başlatmak için aşağıdakine benzer bir kod kullanın. AWS kimlik bilgilerini kullanırsanız, API'ye yönelik tüm istekler imzalanacaktır. Bu, her istek için uygun CORS Accept başlıklarını ayarlamanız gerektiği anlamına gelir:

    var apigClient = apigClientFactory.newClient({
      accessKey: 'ACCESS_KEY',
      secretKey: 'SECRET_KEY',
    });
    

4

AWS_IAM kimlik doğrulamasını etkinleştirirseniz, isteğinizi AWS Signature Sürüm 4'ü kullanarak AWS kimlik bilgileriyle imzalamanız gerekir .

Not : AWS konsolunda oturum açmak, tarayıcınızın isteklerini API'nize otomatik olarak imzalamaz.


3

bazen bu mesaj yanlış bir api'yi aradığınızda gösterilir

api uç noktanızı kontrol edin


2

Yukarıdakilerin hepsini deniyorum, yukarıdaki cevapların tüm adımlarını uyguladıysanız ve sorunu çözmediyseniz, o zaman:

  1. soldaki menüden "Kaynaklar" a tıklayın
  2. "Kaynaklar" sağında, test etmek istediğiniz api yöntemini seçin, örneğin "POST / GET vb.)
  3. "EYLEM" listesine tıklayın (2. adımdaki API yönteminin üzerindedir
  4. "API DEPLOY" seçeneğini seçin (lütfen api'nizi zaten dağıtmış olsanız bile yapın)
  5. "dağıtım aşamasında" "prod" u veya önceki dağıtımınızda yazdıklarınızı seçin (önceki dağıtımınızı geçersiz kılacaktır.
  6. vurmak

"YÖNTEM İSTEĞİ" ni oluşturduğumda (bu menüye nasıl gideceğime bakın), "Yetkilendirme" bölümünde api'yi test ettikten sonra aws test seçeneğinde "AWS_IAM" seçeneğini seçtiğim için, "postacıda deniyorum" "sonra" YÖNTEM TALEBİ "nde," Yetkilendirme "de" hiçbirini "seçmem gerektiğini anlıyorum

Hiçbiri olarak değiştirmedim, ancak AWS'nin açıkladığım gibi tekrar dağıtması gerektiğini düşünüyorum


1

Bu hata çoğunlukla yanlış api uç noktası aradığınızda ortaya çıkar. Aradığınız api uç noktanızı kontrol edin ve bunu api ağ geçidinde doğrulayın.


1

PRIVATE türünde uç noktalı bir API kullanıyorsanız şunlardan emin olun:

  1. API'yi AWS hesabınızdan çağırıyorsunuz (örnek: hesabınızda oluşturulan bir EC2 bulut sunucusundan)

  2. ~ / .Aws / kimlik bilgileri yolundaki EC2 örneğine gerekli kimlik bilgilerini (erişim ve gizli anahtarlar) koyun (bu rota linux örnekleri içindir) IAM kullanıcısı MFA kullanırsa aws_session_token değeri de gerekli olacaktır.

  3. Vpce (vpc uç noktası) tabanlı URL kullanın. Örnek: curl https://vpce-0c0471b7test-jkznizi5.execute-api.us-east-1.vpce.amazonaws.com/dev/api/v1/status

  4. EC2 bulut sunucunuz, vpce'nin sahip olduğu başka bir güvenlik grubuna giden trafiğe izin veren bir güvenlik grubuna sahiptir: EC2 bulut sunucusu

  5. Vpce güvenlik grubunuz, EC2 bulut sunucusuna ait başka bir güvenlik grubundan (ec2 bulut sunucusundan önceki sg) gelen trafiğe aşağıdaki gibi izin verir: vpce sg

Bakınız: https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-private-apis.html


1

Benim durumumda oldukça aptalca bir şeydi. Yeni varlıkların POST kullanılarak oluşturulduğunu ve "Missing Authentication Token" ile başarısız olduğunu öğrendim. Bazı nedenlerden dolayı, iyi çalışan PUT olarak tanımlandığını kaçırdım.


0

Öncelikle, lamda işlevinde oluşturduğunuz API'nin AWS projenize kayıtlı olup olmadığını kontrol edin. Bunun için AWS konsolunuzdaki API ağ geçidine gidin. Kayıtlı değilse, kayıt olun. Bu sorunun ana nedeni budur.

Hatta aws.export.js dosyanızda API'nize karşılık gelen yollar olduğunu görebilirsiniz ['/items'].

API'niz orada bulunmalıdır, aksi takdirde güvenlik jetonunu isteklere eklemeyecektir. Bunun için konsolunuzdaki proje bulut mantığına kaydetmeniz yeterlidir.

Varsa, yukarıda belirtilen çözümü kullanın
http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-use-postman-to-call-api.html


0

Kayıt için, kimlik bilgilerini kullanmayacaksanız, bu hata ayrıca POST / PUT yönteminizdeki istek doğrulayıcıyı "gövdeyi, sorgu dizesi parametrelerini ve BAŞLIKLARI doğrula" veya diğer seçeneği "doğrulama sorgu dizesini" olarak ayarladığınızda da gösterilir. parametreler ve BAŞLIKLAR ".... bu durumda başlıkta kimlik bilgilerini arayacak ve isteği reddedecektir. Özetlemek gerekirse, kimlik bilgilerini göndermeyi düşünmüyorsanız ve açık tutmak istiyorsanız, bu seçeneği istek doğrulayıcıda ayarlamamalısınız (HİÇBİRİ olarak ayarlayın veya gövdeyi doğrulayın)


0

Katkıda bulunmak:

Benzer bir hatayla karşılaştım çünkü dönüş yanıtım şu şekilde 'gövde' içermiyordu:

return {'statusCode': 200, 'body': "değiştirirseniz çalışmazsa gövde etiketini içermelidir"}


0

Aşağıdaki şekilde çözdüğüm aynı sorunu yaşadım:

GET Yöntemi testi

https://54wtstq8d2.execute-api.ap-southeast-2.amazonaws.com/dev/echo/hello
Authorization tab -> 
•   select type(AWS signature)
•   Add AccessKey and SecretKey

0

Sunucunuz için AmazonAPIGatewayInvokeFullAccess iznine sahip bir IAM rolü ayarlarsanız, yine de her istekte üstbilgileri aktarmanız gerekir. Bunu python'da aws-request-auth kitaplığı ile yapabilirsiniz:

import requests
from aws_requests_auth.boto_utils import BotoAWSRequestsAuth
auth = BotoAWSRequestsAuth(
    aws_host="API_ID.execute-api.us-east-1.amazonaws.com",
    aws_region="us-east-1",
    aws_service="execute-api"
)
response = requests.get("https://API_ID.execute-api.us-east-1.amazonaws.com/STAGE/RESOURCE", auth=auth)

0

Hala sorunu olan herkes için ve bunu fark ettikten sonra gerçekten çok aptal hissediyorum, ancak /itemsapi eklerken varsayılan olanın URL'sini geçtim. Ama uç noktayı aramaya devam ettim /api. Gönderinizi Carlos Alberto Schneiderokuduktan sonra sorunumu fark ettiğim için özel teşekkürler .

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.