【问题标题】:DataPower - Azure Service Bus IntegrationDataPower - Azure 服务总线集成
【发布时间】:2017-03-22 11:06:33
【问题描述】:

我正在尝试使用 http 协议从 DataPower 将消息发布到 Azure 服务总线。由于收到未经授权的错误 401,我应该如何传递凭据。

请帮忙,因为我被困在这里了

谢谢

【问题讨论】:

  • 来自wikipedia on 401 status code "响应必须包含一个 WWW-Authenticate 标头字段,其中包含适用于所请求资源的质询" ,该响应标头字段 "WWW-Authenticate" 包含什么?

标签: azureservicebus ibm-datapower


【解决方案1】:

正如这位官方document 提到的Service Bus 身份验证和授权:

应用程序可以使用 共享访问签名 (SAS) 身份验证或通过 Azure Active Directory 访问控制(也称为访问控制服务或 ACS)向 Azure 服务总线进行身份验证)。

SAS 优于 ACS,因为它为服务总线提供了一种简单、灵活且易于使用的身份验证方案。应用程序可以在不需要管理授权“用户”概念的场景中使用 SAS。

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 令牌的更多详细信息,您可以参考 blogtutorial 了解如何从 ACS 请求令牌。

【讨论】:

    【解决方案2】:

    这取决于您是使用 Shared Access Signatures (SAS) 还是 Access Control Service (ACS) 作为服务总线。

    我建议使用 SAS!

    不幸的是,Azure Node.js SDK 有许多 DataPower GatewayScript 无法处理的 fs(文件系统)调用,因此我们无法使用它。

    这是我在某处发现的一个 sn-p,我用 SAS 作为 GatewayScript 来创建标头:

    '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 框架...

    【讨论】:

    • 我已经生成了 SAS 令牌,并且在将 SAS 令牌设置为授权标头值之后,我将请求从 DataPower 发布到 Azure 服务总线。但是我仍然收到一个 401 错误,说我未经授权。无论如何可以看到 Azure 服务总线上收到的 SAS 令牌
    • 通过在您的服务(MPGW?)中启用 DataPower Probe,如果您选择最后一步并查看 Headers 选项卡,您可以看到发送的标头。这将显示发送到 Azure 的内容。
    【解决方案3】:

    我想出了解决办法。以下是我如何获得 SAS 身份验证令牌。

    1. 使用需要 4 个参数的 Java 模块在 IIB 中生成 SAS 令牌:

      一个。 Azure 服务总线的资源 URI
      湾。钥匙
      C。键名
      d。以秒为单位过期。

    2. 在 MQRFH2 标头中设置 SAS 令牌并发送到 DataPower

    3. 使用以下 xslt 提取 SAS 令牌并设置为 DataPower 中 HTTP POST 请求的授权标头。

    <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"/>
    

    【讨论】:

    • 没有 XSLT... :o
    • 我在上一篇文章中添加了它,但它没有显示在论坛中。我在下面再次粘贴了
    • abhi,有三种方法可以修复 XSLT 不显示的问题,如果单击编辑,您会看到我刚刚在已分隔的内容上方的空行上添加了 HTML 注释 &lt;!&gt;在空格中使其成为代码块。似乎有时编号列表后的内容未按预期格式化,我从未见过它像这种情况一样消失,但在过去的。修复它的其他方法是 1. 将缩进加倍到 8 个空格,2. 在 XSLT 块的上方和下方单独使用四个 ````。我还修复了你的 a b c d。
    猜你喜欢
    • 2016-12-10
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 2013-03-22
    • 2017-12-07
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    相关资源
    最近更新 更多