我试图使用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替换它,它就可以正常工作。