Thiếu Mã xác thực khi truy cập API Gateway?


82

Tôi đang cố gọi một Hàm Lambda thông qua Cổng API AWS. Khi tôi đề cập đến loại Xác thực KHÔNG, nó hoạt động tốt nhưng API trở nên công khai và bất kỳ ai có url đều có thể truy cập API của tôi. Để làm cho cuộc gọi API an toàn, tôi đang sử dụng loại Xác thực AWS_IAM và cũng đã đính kèm chính sách AmazonAPIGatewayInvokeFullAccess cho người dùng của mình nhưng gặp lỗi này:

{ message: "Missing Authentication Token"}

Tôi không biết những gì tôi đang thiếu ở đây.


Tôi tin rằng hầu hết nếu không phải tất cả các Câu trả lời ở đây cũng sẽ hoạt động cho bất kỳ Dịch vụ AWS nào khác (ví dụ: cũng là DynamoDB) được ánh xạ phía sau một điểm cuối Tài nguyên API Gateway nhất định. Giả sử điều đó đúng, API Gateway là giao diện hoạt động ở đây (không phải Tài nguyên dịch vụ AWS).
cellepo

Lỗi là do đánh sai điểm cuối
Rexben

Câu trả lời:


40

Tôi nghĩ rằng bạn đang trực tiếp cố gắng truy cập liên kết API, điều này sẽ không hoạt động vì API được bảo mật bằng vai trò IAM và bạn phải cung cấp xác thực AWS tức là Khóa truy cập và Khóa bí mật.

Sử dụng tiện ích mở rộng Postman của Chrome để kiểm tra API của bạn: http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-use-postman-to-call-api.html


Xin chào Saddam, Cách xác thực AWS có thể được thực hiện trong SOAP ui. Trong POSTMAN, nó rất dễ dàng. Chúng ta có cách tương tự trong SOAP UI không?
Pankaj Sharma

154

Tôi đã mất thời gian vì một lý do ngớ ngẩn:

Khi bạn tạo một giai đoạn, liên kết được hiển thị không chứa phần tài nguyên của URL:

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

API + URL NGUỒN LỰC https://1111.execute-api.us-east-1.amazonaws.com/dev/get-list

Các / get-danh sách đã mất tích

Và tất nhiên, bạn cần kiểm tra xem cấu hình phương thức có giống như sau không:

nhập mô tả hình ảnh ở đây


11
yêu cầu kudo đặc biệt để thừa nhận những lý do ngớ ngẩn (nhưng phổ biến) cho một vấn đề. Điều này cũng có tôi.
Jeff Richards

Xin lỗi, tôi không hiểu ý bạn. Nếu bạn muốn kiểm tra xem một yêu cầu đăng bài có được thiết lập để sử dụng xác thực hay không, bạn cần nhấp vào tùy chọn ĐĂNG, chẳng hạn như trong tài nguyên bạn đã tạo, bạn có thể có / my- sau cuộc gọi trong tài nguyên của bạn và trong đó, bạn có các phương thức TÙY CHỌN và ĐĂNG. Nhấp vào ĐĂNG, sau đó trong cấu hình phương thức, ở đó bạn có thể xem có yêu cầu xác thực hay không. Nhưng nếu bạn muốn nhận được URL đầy đủ cho một lệnh gọi bài đăng, nó hoạt động theo cách giống như lấy URL API + NGUỒN LỰC, ví dụ: 1111.execute-api.us-east-1.amazonaws.com/dev/my- pos-tcall
Carlos Alberto Schneider

2
Một điều ngớ ngẩn có liên quan đã khiến tôi vấp phải: hãy đảm bảo rằng động từ HTTP của bạn là chính xác. Tôi đã gửi nhầm một GET thay vì POST. Có vẻ như bạn sẽ gặp lỗi này trên bất kỳ tuyến đường nào không khớp chính xác về cả đường dẫn và động từ.
Josh1billion

Cảm ơn nhiều !! Nó là rất đơn giản khi bạn đề cập đến nó. Tôi không nhận ra. Cảm ơn bạn!
ylev

FWIW, nhấp vào chính Tài nguyên (trong trường hợp này là GET) trước tiên trong cây Giai đoạn mà tôi tin rằng sẽ tiết lộ trực tiếp URL đầy đủ cho tài nguyên đó. Thêm chi tiết và một bức ảnh giải thích trong Câu trả lời liên quan của tôi: stackoverflow.com/a/60858537/1357094
cellepo

21

Tôi vừa gặp sự cố tương tự và có vẻ như nó cũng hiển thị thông báo này nếu không tìm thấy tài nguyên.

Trong trường hợp của tôi, tôi đã cập nhật API nhưng quên triển khai lại. Sự cố đã được giải quyết sau khi triển khai API cập nhật cho giai đoạn của tôi.


Đó là cách tôi làm cho nó hoạt động. Đã triển khai lại tài nguyên !.
KQI

7

Có vẻ như (kể từ tháng 4 năm 2019) AWS API Gateway đưa ra ngoại lệ này vì nhiều lý do - chủ yếu là khi bạn đang chạm vào một điểm cuối mà API Gateway không thể tiếp cận, vì nó không được triển khai hoặc cũng có thể trong các trường hợp cụ thể đó Phương thức HTTP không được hỗ trợ.

Tôi muốn cổng gửi các mã lỗi thích hợp hơn như Phương pháp HTTP 405 không được hỗ trợ hoặc không tìm thấy HTTP 404, thay vì HTTP 403 Forbidden chung chung.


7

Đảm bảo rằng bạn đang nhấp vào Tài nguyên cụ thể trước tiên trong cây Giai đoạn, vì điều đó sẽ điền một URL có đường dẫn đầy đủ đến tài nguyên (thay vì chỉ đường dẫn gốc): nhập mô tả hình ảnh ở đây

Đối với các nguyên nhân khác, hãy xem http://www.awslessons.com/2017/aws-api-gateway-missing-authentication-token/



@sumanthshetty bạn đã thử giải pháp này hay bất kỳ phần nào trong số các Câu trả lời còn lại ở đây chưa? Hay bạn đã đọc liên kết AWS từ đây?
cellepo

tôi đã thử tất cả câu trả lời từ đây và cả bài báo
sumanth shetty

6

Đảm bảo rằng bạn tạo Tài nguyên và sau đó tạo phương thức bên trong nó. Đó là vấn đề đối với tôi. Cảm ơn

nhập mô tả hình ảnh ở đây


5

Tìm thấy cái này trong tài liệu:

Nếu ủy quyền AWS_IAM đã được sử dụng, bạn sẽ ký yêu cầu bằng giao thức Chữ ký Phiên bản 4.

Yêu cầu ký với Phiên bản Chữ ký 4


Bạn cũng có thể tạo SDK cho API của mình.

Cách tạo SDK cho một API trong API Gateway

Khi bạn đã tạo SDK cho nền tảng bạn chọn, bước 6 đề cập rằng nếu bạn đang sử dụng thông tin đăng nhập AWS, yêu cầu đối với API sẽ được ký:

  1. Để khởi tạo SDK do API Gateway tạo bằng thông tin đăng nhập AWS, hãy sử dụng mã tương tự như sau. Nếu bạn sử dụng thông tin đăng nhập AWS, tất cả các yêu cầu tới API sẽ được ký. Điều này có nghĩa là bạn phải đặt tiêu đề Chấp nhận CORS thích hợp cho mỗi yêu cầu:

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

4

Nếu bạn bật xác thực AWS_IAM, bạn phải ký yêu cầu của mình bằng thông tin đăng nhập AWS bằng AWS Signature phiên bản 4 .

Lưu ý : việc đăng nhập vào bảng điều khiển AWS không tự động ký các yêu cầu của trình duyệt tới API của bạn.


3

đôi khi thông báo này hiển thị khi bạn đang gọi nhầm một api

kiểm tra điểm cuối api của bạn


2

Tôi thử tất cả các bước ở trên, nếu bạn đã thực hiện tất cả các bước trong các câu trả lời trên và bạn không giải quyết được vấn đề, thì:

  1. trên menu bên trái, nhấn vào "Tài nguyên"
  2. ở bên phải "Tài nguyên", hãy nhấn vào phương thức api mà bạn muốn kiểm tra, như "POST / GET, v.v.)
  3. nhấn vào danh sách "HÀNH ĐỘNG" (ở trên với phương thức API ở bước 2
  4. chọn "DEPLOY API" (vui lòng làm điều đó, ngay cả khi bạn đã triển khai api của mình)
  5. trong "giai đoạn triển khai", hãy chọn "sản phẩm" hoặc những gì bạn đã viết trong lần triển khai trước của mình (nó sẽ ghi đè lần triển khai trước đó của bạn
  6. nhấn triển khai

Tôi điều đó là do, khi tôi tạo "YÊU CẦU PHƯƠNG PHÁP" (xem bước 2 cách chuyển đến menu này), trong "Ủy quyền", tôi chọn "AWS_IAM" sau khi thử nghiệm api, trong tùy chọn kiểm tra aws, tôi thử nó trong "người đưa thư "thì tôi hiểu trong" YÊU CẦU PHƯƠNG PHÁP ", trong" Ủy quyền ", tôi nên chọn" không "

Tôi thay đổi nó thành không, nhưng tôi nghĩ AWS, cần phải triển khai lại, như tôi giải thích


1

Lỗi này chủ yếu xảy ra khi bạn gọi sai điểm cuối api. Kiểm tra điểm cuối api của bạn mà bạn đang gọi và xác minh điều này trên cổng api.


1

Nếu bạn đang sử dụng API có điểm cuối thuộc loại PRIVATE , hãy đảm bảo:

  1. Bạn đang gọi API từ trong tài khoản AWS của mình (ví dụ: từ phiên bản EC2 được tạo trong tài khoản của bạn)

  2. Đặt thông tin xác thực cần thiết (khóa truy cập và khóa bí mật) trong phiên bản EC2 trong route ~ / .aws / credentials (tuyến đường này dành cho phiên bản linux) Nếu người dùng IAM sử dụng MFA thì giá trị aws_session_token cũng sẽ được yêu cầu.

  3. Sử dụng URL dựa trên vpce (vpc endpoint). Ví dụ: curl https://vpce-0c0471b7test-jkznizi5.execute-api.us-east-1.vpce.amazonaws.com/dev/api/v1/status

  4. Phiên bản EC2 của bạn có một nhóm bảo mật hơn là cho phép lưu lượng ra ngoài đến một nhóm bảo mật khác do vpce sở hữu như: Phiên bản EC2 sg

  5. Nhóm bảo mật vpce của bạn cho phép lưu lượng đến từ một nhóm bảo mật khác (sg trước đó từ phiên bản ec2) do phiên bản EC2 sở hữu như: vpce sg

Xem: https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-private-apis.html


0

Trước hết, hãy kiểm tra xem API bạn tạo trong hàm lamda có được đăng ký với dự án AWS của bạn hay không. Đối với điều đó, hãy truy cập cổng API trong bảng điều khiển AWS của bạn. Nếu nó chưa được đăng ký, hãy đăng ký nó. Đây là nguyên nhân chính của vấn đề này.

Bạn thậm chí có thể thấy trong tệp aws.export.js của mình , có các đường dẫn tương ứng với API của bạn ['/items'].

API của bạn phải có ở đó, nếu không nó sẽ không gắn mã thông báo bảo mật vào các yêu cầu. Chỉ cần đăng ký nó trong logic đám mây dự án của bạn trong bảng điều khiển của bạn cho việc này.

Nếu nó ở đó, thì hãy sử dụng giải pháp được đề cập ở trên
http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-use-postman-to-call-api.html


0

Đối với bản ghi, nếu bạn không sử dụng thông tin đăng nhập, lỗi này cũng hiển thị khi bạn đang đặt trình xác thực yêu cầu trong phương thức POST / PUT của mình thành "xác thực nội dung, tham số chuỗi truy vấn và HEADERS" hoặc tùy chọn khác "xác thực chuỗi truy vấn tham số và HEADERS ".... trong trường hợp đó nó sẽ tìm kiếm thông tin đăng nhập trên tiêu đề và từ chối yêu cầu. Tóm lại, nếu bạn không có ý định gửi thông tin đăng nhập và muốn giữ nó ở trạng thái mở, bạn không nên đặt tùy chọn đó trong trình xác thực yêu cầu (đặt nó thành NONE hoặc để xác thực nội dung)


0

Đóng góp:

Tôi đã gặp lỗi tương tự vì phản hồi trả lại của tôi không chứa 'body' như sau:

return {'statusCode': 200, 'body': "phải chứa thẻ body nếu bạn thay thế nó sẽ không hoạt động"}


0

Tôi đã gặp vấn đề tương tự mà tôi đã giải quyết theo cách sau:

GET Phương pháp kiểm tra

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

0

Nếu bạn thiết lập vai trò IAM cho máy chủ của mình có quyền AmazonAPIGatewayInvokeFullAccess, bạn vẫn cần chuyển tiêu đề cho mỗi yêu cầu. Bạn có thể thực hiện việc này trong python với thư viện aws-request-auth như sau:

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

Trong trường hợp của tôi, đó là một điều khá ngu ngốc. Tôi đã quen với việc các thực thể mới được tạo bằng POST và nó không thành công với "Thiếu Mã xác thực". Tôi đã bỏ lỡ điều đó vì lý do nào đó nó được định nghĩa là PUT đang hoạt động tốt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.