我正在寻找使用Azure存储Java SDK验证使用SAS的任意Azure Table连接字符串的简单方法:
https://example.table.core.windows.net/example?sig=aaabbbcccdddeeefffggghhh%3D&se=2020-01-01T00%3A00%3A00Z&sv=2015-04-05&tn=example&sp=raud
我尝试了CloudTable api暴露的一堆不同方法,但没有一种方法有效。
CloudTable.exists()
都会抛出StorageException
getName()
,getStorageUri()
,getUri()
和其他getter - 无论凭据如何都在本地工作
getServiceClient().downloadServiceProperties()
和getServiceClient().getServiceStats()
也会抛出各种异常,而getServiceClient().getEndpoint()
和getServiceClient().getCredentials()
以及其他人总是在本地工作。
为什么我不只是在表中查询一行或两行?好吧,在很多情况下,我需要验证一个只提供写入或更新权限的SAS(没有delete
或read
权限),而且我不想执行一个只更改表中某些内容的语句检查凭据。
答案 0 :(得分:2)
回答你的问题:
CloudTable.exists()抛出StorageException,无论是否 凭证有效
我认为在将此方法与SAS令牌一起使用时,SDK存在一个错误。我记得有一段时间回到同一个问题。
getName(),getStorageUri(),getUri()和其他getter - 所有工作 本地,无论凭证如何
这些将起作用,因为他们不进行网络呼叫。他们只是在不同的实例变量中使用他们可用的数据并返回数据。
getServiceClient()。downloadServiceProperties()和 getServiceClient()。getServiceStats()也抛出各种异常, 而getServiceClient()。getEndpoint()和 getServiceClient()。getCredentials()和其他人总是在本地工作。
为了getServiceClient().someMethod()
使用SAS,您需要Account SAS
而不是Service SAS
(您现在正在使用)。
为什么我不只是在表中查询一行或两行?嗯,在很多情况下 我需要验证只提供写入或更新预留的SAS (没有删除或读取权限),我不想执行 声明改变表中的内容只是为了检查 凭证。
检查SAS令牌执行写入操作的有效性的一种可能方法是执行写入操作,您知道该操作会因错误而失败。例如,您可以尝试插入已存在的实体。在这种情况下,您应该收到Conflict (409)
错误。您可以尝试执行的其他操作是通过指定一些随机Etag
值来执行乐观写入,并检查Precondition Failed (412)
错误。如果您收到403错误或404错误,则表示您的SAS令牌有问题。