Создание Amazon Signaure V4 для редактора изображений Froala с использованием Rails gem

Я следую этому руководству по созданию Подпись Амазонки.

  def getSignatureKey
    kDate    = OpenSSL::HMAC.digest('sha256', 'AWS4' + Figaro.env.aws_secret_access_key, Time.zone.now.utc.strftime('%Y%m%d'))
    kRegion  = OpenSSL::HMAC.digest('sha256', kDate, 'us-west-2')
    kService = OpenSSL::HMAC.digest('sha256', kRegion, 's3')
    kSigning = OpenSSL::HMAC.digest('sha256', kService, 'aws4_request')
    kSigning
  end

Я использую гем froala для рельсов и использую опцию imageUploadToS3. Однако я получаю эту ошибку при использовании новой версии подписи Amazon.

Encoding::UndefinedConversionError at /admin/campaigns/1/edit_content
"\xAC" from ASCII-8BIT to UTF-8

Я попытался изменить его на getSignatureKey.force_encoding("ISO-8859-1").encode("UTF-8"). После этого сервер работает нормально, и когда я загружаю изображение, я получаю SignatureDoesNotMatch от Amazon.

Любая помощь приветствуется.


person Wajid Kagzi    schedule 18.06.2016    source источник
comment
Вы нашли решение? Я получаю ту же ошибку.   -  person Ivangrx    schedule 10.03.2017
comment
Не могли бы вы попробовать ответ, который я разместил?   -  person Jeremie    schedule 11.03.2017


Ответы (2)


Только предположение, а как насчет этого?

kDate    = OpenSSL::HMAC.digest('sha256', 'AWS4' + Figaro.env.aws_secret_access_key, Time.zone.now.utc.strftime('%Y%m%d')).encode("iso-8859-1").force_encoding("utf-8")

Или просто

kDate    = OpenSSL::HMAC.digest('sha256', 'AWS4' + Figaro.env.aws_secret_access_key, Time.zone.now.utc.strftime('%Y%m%d')).encode("UTF-8")
person Jeremie    schedule 11.03.2017

Ivangrx спросил, что я сделал, чтобы решить эту проблему. В итоге я не пошел по этому пути, чтобы загрузить изображение непосредственно на S3. Вместо этого я добавил imageUploadURL к моей инициализации froala. Это почтовый запрос, в котором я беспокоюсь о том, чтобы выполнить всю свою работу. Вот как выглядит моя забота. Я использую обновленную версию aws-sdk.

module Uploadable
  extend ActiveSupport::Concern
  # NOTE: This method must be set inside all controllers that are including this module
  # This is set this way so that it will throw an exception if you forget to create the method because that would
  # silently cause the image uploading to not work correctly.
  included do
    before_action :set_image_upload_path
  end

  def upload_image
    # Setup AWS credentials
    Aws.config.update(access_key_id: Figaro.env.aws_access_key_id,
                      secret_access_key: Figaro.env.aws_secret_access_key)

    s3 = Aws::S3::Resource.new(region: 'us-west-2')

    # Prepare the necessary parameters
    bucket = if Rails.env.production?
               'app-production'
             else
               'app-dev'
             end

    # If no user, then user_id_prefix will be nil which means the user id will just not be included in the filename
    name = build_unique_filename
    file = params[:file].tempfile

    # Create the image to upload
    image = s3.bucket(bucket).object(name)

    # Upload it and respond back to Froala but respond back to Airbrake with an error message
    if image.upload_file(file, acl: 'public-read')
      render json: { link: image.public_url }
    else
      Airbrake.notify_or_ignore(error_message: 'There was a problem uploading an image to the S3 account.')
    end
  end

  def build_unique_filename
    user_id_prefix = "#{(current_user || current_admin).id}-" if current_user || current_admin

    "#{controller_name}/#{user_id_prefix}#{Time.now.to_i}-" + params[:file].original_filename
  end
end

Это сработало очень хорошо, так как я смог определить разные пути загрузки для каждого из моих ресурсов и загрузить изображения в определенные каталоги в моей корзине S3. Если у вас есть какие-либо вопросы, пожалуйста, оставьте комментарии.

person Wajid Kagzi    schedule 12.03.2017