Доступ запрещен при чтении с предварительно подписанного URL-адреса, созданного на статическом веб-сайте - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть статический веб-сайт, где в пользовательском интерфейсе я беру имя корзины, имя объекта из HTML-формы, размещенной в корзине S3.После нажатия кнопки эти параметры затем отправляются в шлюз API через POST, который, в свою очередь, передает его в Lambda.Затем Lambda генерирует предварительно заданный URL-адрес на основе этих параметров и отправляет его обратно в интерфейс пользователя.Когда я генерирую URL-адрес из Lambda, он работает, но я получаю отказ в доступе, когда пытаюсь получить доступ к объекту по URL-адресу, созданному пользовательским интерфейсом.Вот моя политика корзины, в которой хранится объект:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PresignedPermissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::12345678:role/accessS3"
            },
            "Action": "s3:GetObject",
            "Resource": [
                "arn:aws:s3:::testEXAMPLEbucket/*"
            ]
        }
    ]
}

Моя конфигурация CORS для корзины, в которой хранится объект.

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

Лямбда-код:

'use strict';

const AWS = require('aws-sdk');
const s3 = new AWS.S3()

exports.handler = (event, context, callback) => {
    // TODO implement
    var params = {
            'Bucket' : event['bucketName'],
            'Key' : event['objectName'],
            'Expires' : event['expiration']
    };

   s3.getSignedUrl('getObject', params, (error, url) => {
    if (error) {
      callback(error);
    } else {
      callback(null, {url: url});
    }
  });

};

Код HTML-скрипта:

var API_ENDPOINT_POST = "https://***.**-api.us-east-1.**.com/prod/"

//AJAX POST REQUEST
document.getElementById("getURL").onclick = function(){
  var inputData = {
    "bucketName":$('#bucketName').val(),
        "objectName":$('#objectName').val(),
        "expiration":$('#expiration').val()         
      };
  $.ajax({
        url: API_ENDPOINT_POST,
        type: 'POST',
        data:  JSON.stringify(inputData)  ,
        contentType: 'application/json; charset=utf-8',
        success: function (response) {
          document.getElementById("showURL").value = response.url;
        },
        error: function () {
            alert("error");
        }
    });
}

Роль, используемая в Lambda, имеет FULLS3ACCESS.Я прочитал большинство постов и внес в них изменения, но ни один из них не помог.Пожалуйста, дайте мне знать, если я что-то упустил.Я был бы очень признателен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...