【问题标题】:Not able to Generate right SAS token for azure blob无法为 azure blob 生成正确的 SAS 令牌
【发布时间】:2020-03-29 12:24:27
【问题描述】:

我正在尝试使用 java 库 azure-storage 8.0.0 生成 SAS 令牌并在容器级别生成 SAS 令牌,然后我正在使用该 sas 令牌来运行 azcopy 命令。以下是用于生成 SAS 令牌的代码。

  /**
    * generates the permission policy for storage account
    *
    * @param blobExpiry expiry of sas token
    * @return
    */
  private def getBlobPolicy(blobExpiry: Date, permissionString: String): SharedAccessBlobPolicy = {
    val policy = new SharedAccessBlobPolicy()
    policy.setSharedAccessStartTime(Date.from(ZonedDateTime.now().toInstant))
    policy.setSharedAccessExpiryTime(blobExpiry)
    policy.setPermissionsFromString(permissionString)

    policy
  }

* @param permissionString permission string ex. radcwl where r = read, a= add, d=delete, c = create w=write l = list
    * @return SASToken for container
    */
  def getContainerSASToken(permissionString: String): String = {
    val container = getAzureblobConfig().getContainerRef(new String(Base64.encodeBase64(getAzureblobConfig()
      .sparkKeyOptionName().getBytes()))).get
    val expiryDate: Date = Date.from(ZonedDateTime.now.toInstant.plusSeconds(86400))

    "\"" + s"?${container.generateSharedAccessSignature(getBlobPolicy(expiryDate, permissionString), null)}" + "\""
  }

我想这是生成 SAS 令牌的方式,但它无法生成正确的令牌。

我遇到的错误:

签名不匹配。使用的签名字符串是 racwdl

403 服务器未能验证请求。确保 Authorization 标头的值正确形成,包括签名

代码生成的令牌:

?sig=P5BfjwRj3fxDWoohchvZmr3w3cEnzjewv8KbX8zUmeY%3D&st=2019-12-03T06%3A56%3A51Z&se=2019-12-10T06%3A56%3A51Z&sv=2018-03-28&spr=https&sp=racwdl&sr=c

如果我要从 Azure 存储资源管理器生成 SAS 令牌并用我的代码生成的 SAS 替换它,它可以正常工作。

【问题讨论】:

  • 请编辑您的问题并包括两件事:1)您的代码生成的 SAS 令牌(您可以混淆 sig 部分)和 2)您遇到的错误。
  • @GauravMantri 我已经更新了这两件事。
  • 您是在本地还是在 Azure 中运行上面的代码?你所在的时区是?
  • 你想做什么动作?
  • 我想写入 blob @JimXu

标签: scala azure azure-blob-storage


【解决方案1】:

你可以试试下面的,

val sasConstraints = new SharedAccessBlobPolicy
    sasConstraints.setSharedAccessExpiryTime(DateTime.now.plusSeconds(5).toDate)
    sasConstraints.setPermissions(util.EnumSet.of(SharedAccessBlobPermissions.WRITE))

    val blob = blobClient.getContainerReference(repo.getContainer).getBlockBlobReference(path)
    blob.getUri.toString + "?" + blob.generateSharedAccessSignature(sasConstraints,
      null, null, null, SharedAccessProtocols.HTTPS_ONLY)

SAMPLE REPOSITORY

【讨论】:

    猜你喜欢
    • 2018-12-12
    • 2018-08-14
    • 2021-02-12
    • 1970-01-01
    • 2019-04-28
    • 2020-08-07
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多