在Http查询参数请求中使用SAS令牌的Azure Logic App

时间:2018-08-15 15:03:08

标签: azure azure-storage azure-logic-apps

我正在创建一个可与Abbyy的OCR REST API配合使用的Azure逻辑应用程序。

我使用Create SAS URI by path动作返回Web URLWeb URL将包含SAS令牌的FQDN返回到我的Blob。

Web URL作为查询参数传递给Http动作。在代码视图中,JSON的相关部分如下所示:

"method": "GET",
"uri": "https://cloud.ocrsdk.com/processRemoteImage?source=@{body('Create_SAS_Uri_by_path')?['WebUrl']}&language=English&exportformat=pdfSearchable&description=blah&imageSource=scanner"

uri会这样解决:

https://cloud.ocrsdk.com/processRemoteImage?source=https://mysaaccount.blob.core.windows.net/inbox/180730110047_0001.pdf?sv=2017-04-17&sr=b&sig=2IGMt1qDZthaBSyvD3WJ6T1zc36Wr%2FNoiB4Wki5Lf28%3D&se=2018-08-16T11%3A16%3A48Z&sp=r&language=English&exportformat=pdfSearchable&description=blah&imageSource=scanner"

这会导致错误(450):

<?xml version="1.0" encoding="utf-8"?><error><message language="english">Invalid parameter: sr</message></error>

基本上是从SAS令牌中获取sr=查询参数,并且该API当然没有sr参数,即使这样做,其值也将是错误的。 / p>

我确实找到了this问题,并且尝试通过调整代码以使用replace函数来“&”转义“&”号,因此:

"method": "GET",
"uri": "https://cloud.ocrsdk.com/processRemoteImage?source=@{replace(body('Create_SAS_Uri_by_path')?['WebUrl'],'%26','%2526' )}&language=English&exportformat=pdfSearchable&description=blah&imageSource=scanner"

但是,这没有效果。即结果URI与上面相同。有趣的是,看来SAS令牌本身已经利用了“百分转义”。

如果有人对如何解决或解决此问题有任何建议,请与我分享您的想法。

有人知道LogicApp操作是否是开源的,以及是否知道GitHub链接是什么。然后我可以提出一个问题。

1 个答案:

答案 0 :(得分:1)

解决了。

我基本上是在正确的轨道上,但是当我应该使用%26时我使用了&,所以使用上面的代码,它应该显示为:

"method": "GET",
"uri": "https://cloud.ocrsdk.com/processRemoteImage?source=@{replace(body('Create_SAS_Uri_by_path')?['WebUrl'],'&','%26' )}&language=English&exportformat=pdfSearchable&description=blah&imageSource=scanner"

因此,URI读取:

https://cloud.ocrsdk.com/processRemoteImage?source=https://mysaaccount.blob.core.windows.net/intray/180730110047_0001.pdf?st=2018-08-17T10%3A55%3A38Z%26se=2018-08-18T10%3A55%3A38Z%26sp=r%26sv=2018-03-28%26sr=b%26sig=FTRoVgV7MRz5d5gTgrEs6D0QSy3268BqscZX1LHbJYQ%3D&language=English&exportformat=pdfSearchable&description=blah&imageSource=scanner

下一步:将XML主体转换为JSON ...

更新1

我已将(值由%2526替换为%26的替换(2018年8月17日)。显然,我的内裤扭曲了。一定是在尝试两次转义,这是不必要的。

尽管Microsoft似乎对SAS令牌进行了部分百分比编码,但我注意到它们使用=%3D进行了百分比编码,但是,Abbyy API似乎并不关心= 。 (由邮递员测试)。

更新2

不确定更新1 为何起作用。可能是因为我将访问策略设置为blob(仅对blob进行了匿名读取访问),并将其设置回private并未生效,或者可能是错误的内容类型。无论如何,它起作用了,然后却没有。嗯,它用&替换了%26没问题,我也尝试转义=,但是端点不喜欢它,通过Postman和Logic App进行了测试。

我的触发器实际上是一个C#BlobTrigger * Azure Function应用程序,并且编写了生成SAS令牌的代码,因此我使用了dotnet的Uri.EscapeDataString()方法:     字符串fullUrl = cloudBlobContainer.Uri +“ /” + blobName + sasToken;

string escapedUri = Uri.EscapeDataString(fullUrl);

log.LogInformation($"Full URL: {fullUrl}");
log.LogInformation($"Escaped URL: {escapedUri}");

return escapedUri;

更新3

刚刚看过这行,是由Logic App设计人员创建的:

"path": "/datasets/@{encodeURIComponent(encodeURIComponent('https://someaccount.sharepoint.com/sites/eps'))}/tables//items//attachments",

看起来像encodeURIComponent()的函数可能与Uri.EscapedDataString做相同的事情,并且会替换replace()函数。我还没有测试。

*我将功能应用程序用作触发器的原因在于成本。尽管有一个Logic App触发器在检测到新的Blob时运行,但它必须按照计划运行。我的计划是消费,我已经读过Logic App运行时MS收费,无论它是否做任何事情。恕我直言,每隔5秒触发一次任务效率低下,而90%的时间无事可做。该功能应用程序更适合我的要求,尽管如果该应用程序已进入睡眠状态,则显然有大约10分钟的“热身”时间。我可以忍受。