如何从wordpress中的请求获取授权标头

时间:2018-11-22 10:28:41

标签: wordpress

我正试图从api请求中提取到向register_rest_route注册的端点的Authorization标头,但它不存在。

我注册了一条路线:

register_rest_route('my_plugin', '/users', array(
    'methods' => 'PUT',
    'callback' => array($this, 'update_user'),
    )
);

简单的哑回调:

public function update_user($request)
{
    $all_headers = $request->get_headers();
    return new WP_REST_Response($all_headers, 200);
}

然后我向确保设置Authorization标头的端点发出请求。

但响应中缺少标头:

{
  "host": ["localhost:8080"],
  "connection": ["keep-alive"],
  "content_length": ["23"],
  "accept": ["application/json, text/plain, */*"],
  "origin": ["http://localhost:8080"],
  "user_agent": [],
  "content_type": ["application/json;charset=UTF-8"],
  "referer": [
    "http://localhost:8080"
  ],
  "accept_encoding": ["gzip, deflate, br"],
  "accept_language": ["en-US,en;q=0.9"],
  "cookie": []
}

3 个答案:

答案 0 :(得分:2)

$ request-> get_headers()将没有HTTP授权标头,因为$ request-> set_headers()如下完成:

$request->set_headers( $this->get_headers( wp_unslash( $_SERVER ) ) );

其中$ this是WP_REST_Server的实例。但是WP_REST_Server的get_headers()在class-wp-rest-server.php中定义如下:

/**
 * Extracts headers from a PHP-style $_SERVER array.
 *
 * @since 4.4.0
 *
 * @param array $server Associative array similar to `$_SERVER`.
 * @return array Headers extracted from the input.
 */

public function get_headers( $server ) {
    $headers = array();

    // CONTENT_* headers are not prefixed with HTTP_.
    $additional = array( 'CONTENT_LENGTH' => true, 'CONTENT_MD5' => true, 'CONTENT_TYPE' => true );

    foreach ( $server as $key => $value ) {
        if ( strpos( $key, 'HTTP_' ) === 0 ) {
            $headers[ substr( $key, 5 ) ] = $value;
        } elseif ( isset( $additional[ $key ] ) ) {
            $headers[ $key ] = $value;
        }
    }

    return $headers;
}

因此,仅提取前缀为“ _HTTP”的全局$ _SERVER的成员以及成员“ CONTENT_LENGTH”,“ CONTENT_MD5”和“ CONTENT_TYPE”。但是授权成员是$ _SERVER全局变量中的'PHP_AUTH_USER','PHP_AUTH_PW'和'PHP_AUTH_DIGEST'。

答案 1 :(得分:0)

我的主要猜测是WP_Rest稍后将其剥离。 您可以通过以下方式查看未过滤的结果:

public function update_user($request)
{
    echo json_encode($request->get_headers())
    exit;
}

如果这样做没有帮助。
发送随机标头,会出现吗?如果标题以x-

开头,则可以发送该标题

答案 2 :(得分:0)

确保您的服务器实际上启用了HTTP授权标头;在Apache网站配置或.htaccess中:

RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

这应该返回标题:

$request->get_header('authorization')