如何配置 Apigility 以发送 HMAC-Authorization 响应标头?

Posted

技术标签:

【中文标题】如何配置 Apigility 以发送 HMAC-Authorization 响应标头?【英文标题】:How can I configure Apigility to send HMAC-Authorization response headers? 【发布时间】:2016-12-18 21:23:27 【问题描述】:

我正在使用 Hmac 在 Apigility 中实施授权。基本上我将这个家伙的类用于客户端和服务器(https://github.com/reinaldoborges/rb-sphinx-hmac-zf2-client)。

现在我在向我的 Api 发送 GET 之前有了这段代码。

$hmac = new HMAC(
            new HMACv0(), 
            new phpHash('sha256'), 
            new StaticKey('[PRE-SHARED KEY]'), 
            new DummyNonce()       
    );

    $hmac->setKeyId('certkey');
    $hmac->setNonceValue('certNonce');


    $uri = "http://apicert.local/certificados";
    $cliente = new HMACHttpClient($uri);
    $cliente->setMethod('GET');
    $cliente->setHmac($hmac);

    try 
        $cliente->send();

        /**
         * Resposta
         */
        echo "Request HMAC Header:", PHP_EOL; **I'm asking for a Reply using HMAC-Authorization type of header **
        echo '     ', HMACHttpClient::HEADER_NAME, ' = ', $cliente->getHeader(HMACHttpClient::HEADER_NAME), PHP_EOL, PHP_EOL;
     catch (Exception $e) 
        /**
         * ERRO
         */
        echo "##### ERRO #####", PHP_EOL;
        echo $e->getCode(), ' : ', $e->getMessage(), PHP_EOL;
        echo "##### ERRO #####", PHP_EOL, PHP_EOL;
    
    $response = $cliente->getResponse();
    echo "Response Status Code: ", $response->getStatusCode(), PHP_EOL, PHP_EOL;
    echo "Response Headers: ";
    print_r($response->getHeaders()->toArray());
    echo PHP_EOL;
    echo "Response Cookies:", PHP_EOL;
    $cookies = $response->getCookie();
    foreach ($cookies as $cookie) 
        echo '     ', $cookie->toString(), PHP_EOL;
    
    echo PHP_EOL;
    echo "Response Body:", PHP_EOL;
    echo $response->getBody();
    echo PHP_EOL, PHP_EOL;

我收到一个 406 状态代码,指出这种标题是不可接受的。我尝试添加内容协商白名单,但没有此选项。那我怎样才能从服务器获得授权呢?

请求 HMAC 标头:HMAC-Authentication = 1:certkey:certNonce:f9c9edcda43df5c466e54449f31900a6f9387afa32168327a0873a69b023abef 响应状态代码:406 响应标头:数组([日期] => 2016 年 8 月 11 日星期四 23:55:33 GMT /2.4.7 (Ubuntu) [Access-Control-Max-Age] => 1000 [Access-Control-Allow-Headers] => X-Requested-With, Content-Type, Origin, Authorization, Accept, Client-Security-令牌,Accept-Encoding [Access-Control-Allow-Methods] => POST,GET,OPTIONS,DELETE,PUT [Access-Control-Allow-Origin] => * [Content-Length] => 149 [Connection] =>关闭 [Content-Type] => application/problem+json ) 响应 Cookie:响应正文:"type":"http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html","title":"Not Acceptable","status":406,"detail": “不能接受指定的接受类型”

【问题讨论】:

【参考方案1】:

您必须创建一个新的授权类型。 在 APIgility ui 的顶部有一个名为 Authorization 的按钮。 您可以在此处添加所需的任何授权适配器。如果你愿意,甚至是 hmac 适配器。

我个人用它来创建一个 jwt 适配器。

现在,这个适配器应该扩展 ZF\MvcAuth\Authentication\AdapterInterface。 我还将此适配器添加到我的服务管理器中。

【讨论】:

以上是关于如何配置 Apigility 以发送 HMAC-Authorization 响应标头?的主要内容,如果未能解决你的问题,请参考以下文章

在apigility中触发RPC控制器中的REST请求

如何在 CrashRpt 中配置电子邮件设置以发送故障转储?

如何配置 WAMP (localhost) 以使用 Gmail 发送电子邮件?

如何配置OAuth服务器以发送配置文件信息?

如何配置 .net 核心以将身份验证 cookie 发送到不同的域

如何配置引擎 ID 以使用 SNMP4J 发送 SNMP 陷阱 V3?