DataPower - Azure 服务总线集成
DataPower - Azure Service Bus Integration
我正在尝试使用 http 协议 post 从 DataPower 向 Azure 服务总线发送消息。我应该如何传递凭据,因为我收到未经授权的错误 401。
请帮忙,因为我卡在这里了
谢谢
这取决于您为服务总线使用的是 Shared Access Signatures
(SAS) 还是 Access Control Service
(ACS)。
我推荐使用 SAS!
不幸的是,Azure Node.js SDK 有很多 DataPower GatewayScript 无法处理的 fs(文件系统)调用,因此我们无法使用它。
这是我在某个地方找到的一个片段,我已将其用于 SAS 作为 GatewayScript 来创建 headers:
'use strict';
var crypto = require('crypto');
// ServiceBus parameters
var namespace = '<Your-ServiceBus-Namespace>';
var queue ='<Your-Queue>';
var AccessKeyName = '<Your-AccessKey-Name>';
var AccessKey = '<Your-AccessKey>';
// Full ServiceBus Queue publisher URI
var ServiceBusUri = 'https://' + namespace + '.servicebus.windows.net' + '/' + queue;
function createSASToken(uri, keyName, key)
{
//Token expires in December
var expiry = '1417774602';
var crypto = require('crypto');
var signedString = encodeURIComponent(uri) + '\n' + expiry;
var hmac = crypto.createHmac('sha256', key);
hmac.update(signedString);
var signature = hmac.digest('base64');
var token = 'SharedAccessSignature sr=' + encodeURIComponent(uri) + '&sig=' + encodeURIComponent(signature) + '&se=' + expiry + '&skn=' + keyName;
return token;
}
var SASToken = createSASToken(ServiceBusUri, AccessKeyName, AccessKey)
console.log(SASToken);
var options = {
hostname: namespace + '.' + 'servicebus.Windows.net',
port: 443,
path: '/' + queue + '/messages',
method: 'POST',
headers: {
'Authorization': SASToken,
'Content-Type': 'application/atom+xml;type=entry;charset=utf-8',
}
};
// GatewayScript url-open() goes here...
// End
我刚刚从另一个项目中提取了代码,因此您需要在其上添加一些处理程序和 GatewayScript 框架...
正如这位官方 document 提到的关于服务总线身份验证和授权:
Applications can authenticate to Azure Service Bus using either Shared Access Signature (SAS) authentication, or through Azure Active Directory Access Control (also known as Access Control Service or ACS).
SAS is recommended over ACS, as it provides a simple, flexible, and easy-to-use authentication scheme for Service Bus. Applications can use SAS in scenarios in which they do not need to manage the notion of an authorized "user."
1) 共享访问签名
令牌采用以下格式:
SharedAccessSignature sig=<signature-string>&se=<expiry>&skn=<keyName>&sr=<URL-encoded-resourceURI>
为 sending message 使用共享访问签名(在 HTTP 级别):
POST http{s}://<yournamespace>.servicebus.windows.net/<path>/messages
Authorization: SharedAccessSignature sr=https%3A%2F%2F<yournamespace>.servicebus.windows.net%2F<path>&sig=<your-signature>&se=1438205742&skn=KeyName
ContentType: application/atom+xml;type=entry;charset=utf-8
更多详细信息,您可以参考此tutorial根据您的开发语言生成SAS令牌。
2) 访问控制服务 (ACS)
您必须使用 New-AzureSBNamespace PowerShell cmdlet 创建命名空间,如下所示:
更多细节,你可以参考这个blog。
使用 ACS 发送消息:
POST http{s}://<yournamespace>.servicebus.windows.net/<path>/messages
Authorization: WRAP access_token={swt}
ContentType: application/atom+xml;type=entry;charset=utf-8
构造一个SWT代币
有关获取 SWT 令牌的更多详细信息,您可以参考此blog and this tutorial关于如何从 ACS 请求令牌。
我想出了解决办法。下面是我如何实现 SAS 身份验证令牌。
使用需要 4 个参数的 Java 模块在 IIB 中生成 SAS 令牌:
一个。 Azure 服务总线的资源 URI
b.钥匙
C。密钥名称
d.以秒为单位过期。
在 MQRFH2 header 中设置 SAS 令牌并发送到 DataPower
使用以下 xslt 在 DataPower 中提取 SAS 令牌并设置为 HTTP POST 请求的授权 header。
<xsl:variable name="entries" select="dp:request-header('MQRFH2')" />
<xsl:variable name="header" select="dp:parse($entries)" />
<xsl:variable name="SAS">
<xsl:choose>
<xsl:when test="$header//usr//SAS">
<xsl:value-of select="$header//usr//SAS" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="false()" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<dp:set-http-request-header name="'Authorization'" value="$SAS"/>
我正在尝试使用 http 协议 post 从 DataPower 向 Azure 服务总线发送消息。我应该如何传递凭据,因为我收到未经授权的错误 401。
请帮忙,因为我卡在这里了
谢谢
这取决于您为服务总线使用的是 Shared Access Signatures
(SAS) 还是 Access Control Service
(ACS)。
我推荐使用 SAS!
不幸的是,Azure Node.js SDK 有很多 DataPower GatewayScript 无法处理的 fs(文件系统)调用,因此我们无法使用它。
这是我在某个地方找到的一个片段,我已将其用于 SAS 作为 GatewayScript 来创建 headers:
'use strict';
var crypto = require('crypto');
// ServiceBus parameters
var namespace = '<Your-ServiceBus-Namespace>';
var queue ='<Your-Queue>';
var AccessKeyName = '<Your-AccessKey-Name>';
var AccessKey = '<Your-AccessKey>';
// Full ServiceBus Queue publisher URI
var ServiceBusUri = 'https://' + namespace + '.servicebus.windows.net' + '/' + queue;
function createSASToken(uri, keyName, key)
{
//Token expires in December
var expiry = '1417774602';
var crypto = require('crypto');
var signedString = encodeURIComponent(uri) + '\n' + expiry;
var hmac = crypto.createHmac('sha256', key);
hmac.update(signedString);
var signature = hmac.digest('base64');
var token = 'SharedAccessSignature sr=' + encodeURIComponent(uri) + '&sig=' + encodeURIComponent(signature) + '&se=' + expiry + '&skn=' + keyName;
return token;
}
var SASToken = createSASToken(ServiceBusUri, AccessKeyName, AccessKey)
console.log(SASToken);
var options = {
hostname: namespace + '.' + 'servicebus.Windows.net',
port: 443,
path: '/' + queue + '/messages',
method: 'POST',
headers: {
'Authorization': SASToken,
'Content-Type': 'application/atom+xml;type=entry;charset=utf-8',
}
};
// GatewayScript url-open() goes here...
// End
我刚刚从另一个项目中提取了代码,因此您需要在其上添加一些处理程序和 GatewayScript 框架...
正如这位官方 document 提到的关于服务总线身份验证和授权:
Applications can authenticate to Azure Service Bus using either Shared Access Signature (SAS) authentication, or through Azure Active Directory Access Control (also known as Access Control Service or ACS).
SAS is recommended over ACS, as it provides a simple, flexible, and easy-to-use authentication scheme for Service Bus. Applications can use SAS in scenarios in which they do not need to manage the notion of an authorized "user."
1) 共享访问签名
令牌采用以下格式:
SharedAccessSignature sig=<signature-string>&se=<expiry>&skn=<keyName>&sr=<URL-encoded-resourceURI>
为 sending message 使用共享访问签名(在 HTTP 级别):
POST http{s}://<yournamespace>.servicebus.windows.net/<path>/messages
Authorization: SharedAccessSignature sr=https%3A%2F%2F<yournamespace>.servicebus.windows.net%2F<path>&sig=<your-signature>&se=1438205742&skn=KeyName
ContentType: application/atom+xml;type=entry;charset=utf-8
更多详细信息,您可以参考此tutorial根据您的开发语言生成SAS令牌。
2) 访问控制服务 (ACS)
您必须使用 New-AzureSBNamespace PowerShell cmdlet 创建命名空间,如下所示:
更多细节,你可以参考这个blog。
使用 ACS 发送消息:
POST http{s}://<yournamespace>.servicebus.windows.net/<path>/messages
Authorization: WRAP access_token={swt}
ContentType: application/atom+xml;type=entry;charset=utf-8
构造一个SWT代币
有关获取 SWT 令牌的更多详细信息,您可以参考此blog and this tutorial关于如何从 ACS 请求令牌。
我想出了解决办法。下面是我如何实现 SAS 身份验证令牌。
使用需要 4 个参数的 Java 模块在 IIB 中生成 SAS 令牌:
一个。 Azure 服务总线的资源 URI
b.钥匙
C。密钥名称
d.以秒为单位过期。在 MQRFH2 header 中设置 SAS 令牌并发送到 DataPower
使用以下 xslt 在 DataPower 中提取 SAS 令牌并设置为 HTTP POST 请求的授权 header。
<xsl:variable name="entries" select="dp:request-header('MQRFH2')" />
<xsl:variable name="header" select="dp:parse($entries)" />
<xsl:variable name="SAS">
<xsl:choose>
<xsl:when test="$header//usr//SAS">
<xsl:value-of select="$header//usr//SAS" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="false()" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<dp:set-http-request-header name="'Authorization'" value="$SAS"/>