ruby - 在 Ruby 中生成 Azure 存储 SAS 签名

标签 ruby azure azure-blob-storage azure-storage shared-access-signatures

我尝试使用以下代码生成有效的 URL,用于访问我的 Azure 存储帐户中的 blob。 Azure 帐户名称和 key 存储在 .env 文件中。由于某种原因,该 URL 不起作用;我收到签名不匹配错误。

# version 2018-11-09 and later, https://learn.microsoft.com/en-us/rest/api/storageservices/create-service-sas#version-2018-11-09-and-later

signed_permissions = "r"
signed_start = "#{(start_time - 5.minutes).iso8601}"
signed_expiry = "#{(start_time + 10.minutes).iso8601}"
canonicalized_resource = "/blob/#{Config.azure_storage_account_name}/media/#{medium.tinyurl}"
signed_identifier = ""
signed_ip = ""
signed_protocol = "https"
signed_version = "2018-11-09"
signed_resource = "b"
signed_snapshottime = ""
rscc = ""
rscd = ""
rsce = ""
rscl = ""
rsct = ""

string_to_sign = signed_permissions + "\n" +
          signed_start + "\n" +
          signed_expiry + "\n" +
          canonicalized_resource + "\n" +
          signed_identifier + "\n" +
          signed_ip + "\n" +
          signed_protocol + "\n" +
          signed_version + "\n" +
          signed_resource + "\n" +
          signed_snapshottime + "\n" +
          rscc + "\n" +
          rscd + "\n" +
          rsce + "\n" +
          rscl + "\n" +
          rsct

sig = OpenSSL::HMAC.digest('sha256', Base64.strict_decode64(Config.azure_storage_account_key), string_to_sign.encode(Encoding::UTF_8))

sig = Base64.strict_encode64(sig)

@result = "#{medium.storageurl}?sp=#{signed_permissions}&st=#{signed_start}&se=#{signed_expiry}&spr=#{signed_protocol}&sv=#{signed_version}&sr=#{signed_resource}&sig=#{sig}"

PS:这是在 Rails 中,medium 是从数据库中提取的记录,其中包含有关 Azure 中 blob 的信息。

最佳答案

事实证明问题是时钟偏差。我使用的 signed_startsigned_expiry 金额太紧张了。当我放松到 -30/+20 时,我可以使用我发布的片段可靠地创建 SAS token 。

关于ruby - 在 Ruby 中生成 Azure 存储 SAS 签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72190395/

相关文章:

sql - 使用引用标识列的外键将数据迁移到 Azure

ruby - 将一个函数传递给另一个函数并调用它

c# - Azure Data Lake Store - 从文件读取时出错

ruby - 遏制 epsv 问题

Azure 应用服务在空闲后超时,即使勾选了 'always on'

Azure 存储帐户在 Data Lake Gen2 验证中停留在 0%

c# - 如何更新 Azure.Storage.Blob 中的元数据

azure - 如何使用 SharedAccessSignature 访问 blob

javascript - 如何将资源中的图像附加到 Rails 5 中的 ruby​​ 对象

ruby - 运行 Heroku 控制台无法启动