【发布时间】: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