我正在构建一个在不同客户端的本地硬件上运行的Node JS应用程序。 我希望该应用程序将数据记录到我的Azure存储表中。 (将来,该应用程序可能需要使用其他Azure服务。) 我应该如何授权应用程序的各种实例来访问表?
我希望每个不同的客户端只能使用不同的表,并且只能进行添加和读取访问-不能进行更新或删除。
如果需要,我希望能够立即撤消单个客户端的访问权限,而不会影响其他客户端。
我考虑了3个选择:
我考虑为每个客户端创建一个单独的存储帐户,并为客户端提供该帐户的访问密钥。但这将提供完全访问权限(包括更新和删除)。
我考虑过为每个客户端创建一个存储访问策略(SAP),然后在该策略上创建一个共享访问签名(SAS)。客户端可以与共享访问签名(as described here)连接。我看到的主要缺点是,如果我希望客户端的应用程序可以访问多个表,则每个表都需要一个单独的SAP和SAS。这会增加管理开销。
由于应用是身份的另一种形式,因此我考虑使用registering an app为软件的每个实例创建一个身份。但是我不确定如何(a)使应用程序将凭据传递到Azure存储,或(b)授予该应用程序读取/添加到表的权限。
在AWS中,我已经通过创建IAM用户解决了这个问题。可以通过环境变量访问Node JS代码的键。
但是在Azure中,我的组织有一个Active Directory,但我不是该目录的管理员。我没有看到如何创建Azure用户而不以管理员身份访问表的目的。
有人有什么想法或建议吗?
答案 0 :(得分:2)
您提到过,每个表都没有SAS令牌。对于您的情况,我建议您可以为每个具有SAS令牌未完全访问权限的客户端提供单独的存储帐户。
当前不支持对Azure表的身份验证访问。 预览中仅 Blob 和 Queue 服务可以使用Azure AD集成。
有关使用Azure Active Directory(预览版)对Azure Blob和队列的访问进行身份验证的详细信息,请参考Azure official document。
答案 1 :(得分:0)
在documentation的Node中找到有关确切地如何使用SAS的信息时,我遇到了一些麻烦,因此我认为在此处发布代码示例以供参考可能很有用。
我遵循的步骤是:
npm init
设置节点项目。npm install azure-storage
以下载库。index.js
的文件,其内容如下所示。node index.js
运行代码。请注意,在下面的代码中,我已经修改了我的帐户,表,sasToken等的名称。不要指望它仅能复制粘贴!
const azure = require('azure-storage');
const sasUri = 'https://myaccount.table.core.windows.net/mytable';
const sasQuery = 'sv=2018-03-28&si=saspolicy&tn=mytable&sig=1%2FgfWdreRKfWpRjhRy3E8MiHDIxH35SPZY5ssU8lKw%3D';
const tableService = new azure.TableService(null,null,sasUri,sasQuery);
const item = {
PartitionKey: {'_':'keyvalue'},
RowKey: {'_':'2018-10-10T03:17:21Z'},
Col1: {'_':23},
Col2: {'_':423}
};
tableService.insertEntity('mytable',item,function(err,result,response){
if (err) {
console.error(err);
} else {
console.log('success');
console.log('result = '+JSON.stringify(result,null,' '));
console.log('response = '+JSON.stringify(response,null,' '));
}
});
我的下一个挑战是找到描述实体中用于插入的'_'
键的文档。看起来好像下划线用于该值,而$可以用于类型,尽管如果未指定则可以猜测类型。如果需要,可以使用entityGenerator function生成这些对象。