首页 > 解决方案 > 在 Laravel 中使用 Guzzle 使用 JWT auth 插件访问 Wordpress API。响应的正文为空

问题描述

第一次尝试这个。在一个新Laravel 5.7 + GuzzleHttp项目中,我希望使用JWT Authentication for WP-API plugin for auth访问一个Wordpress 5.0.3站点。

Wordpress设置了用户名和密码,并使用Postman它测试 API url 工作正常。

{
    "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9....",
    "user_email": "webmaster@wptest.com.au",
    "user_nicename": "aeaz62bxqx",
    "user_display_name": "Aeaz62BXqx"
}

另一方面,Laravel Guzzle我像这样测试相同的 uri:

$base_uri = $request->channel_url . '/wp-json/jwt-auth/v1/';

try {

    $client = new client();
    $session = $client->post($base_uri . 'token', [
        'headers' => [
            'Accept' => 'application/json',
        ],
        'form_params' => [
            'username' => $request->wp_user,
            'password' => $request->wp_password,
        ]
    ]);

    // GET BODY CONTENT HERE
    $body = json_decode($session->getBody()->getContents());

    // LOG HERE
    Log::info(print_r($session, true));   // SEE BELOW
    Log::info(print_r($body));   // EMPTY

    // GRAB TOKEN HERE
    $wp_token = $body->token;


    if ($session->getStatusCode() == '200') {

        $website->update([
            'wp_user' => $request->wp_user,
            'wp_password' => $request->wp_password,
            'wp_token' => $wp_token,
        ]);

    } else {

        return response()->json([
            'message' => 'We cannot log in to your Wordpress site at this time.'
        ], 401);

    }

} catch (RequestException $e) {
    $error = Psr7\str($e->getRequest());
    if ($e->hasResponse()) {
        $error .= '<br/>' . Psr7\str($e->getResponse());
    }
    return response()->json([
        'message' => 'There was an error connecting to Wordpress (U: ' . $request->wp_user . ', P: ' . $request->wp_password . ')'
    ], 401);
}

当我执行上述操作并记录响应时,我得到一个200状态码和以下似乎不包含令牌、user_email 等的内容。如果我故意更改用户名或密码,我会被403禁止,所以我假设它响应时已通过身份验证200

欢迎任何帮助。

[2019-02-20 11:42:03] local.INFO: 1  
[2019-02-20 11:42:03] local.INFO: GuzzleHttp\Psr7\Response Object
(
    [reasonPhrase:GuzzleHttp\Psr7\Response:private] => OK
    [statusCode:GuzzleHttp\Psr7\Response:private] => 200
    [headers:GuzzleHttp\Psr7\Response:private] => Array
        (
            [Server] => Array
                (
                    [0] => nginx/1.15.5
                )

            [Date] => Array
                (
                    [0] => Wed, 20 Feb 2019 11:42:03 GMT
                )

            [Content-Type] => Array
                (
                    [0] => application/json; charset=UTF-8
                )

            [Transfer-Encoding] => Array
                (
                    [0] => chunked
                )

            [Connection] => Array
                (
                    [0] => keep-alive
                )

            [X-Robots-Tag] => Array
                (
                    [0] => noindex
                )

            [Link] => Array
                (
                    [0] => <http://wptest.com.au/wp-json/>; rel="https://api.w.org/"
                )

            [X-Content-Type-Options] => Array
                (
                    [0] => nosniff
                )

            [Access-Control-Expose-Headers] => Array
                (
                    [0] => X-WP-Total, X-WP-TotalPages
                )

            [Access-Control-Allow-Headers] => Array
                (
                    [0] => Authorization, Content-Type
                )

            [Allow] => Array
                (
                    [0] => POST
                )

        )

    [headerNames:GuzzleHttp\Psr7\Response:private] => Array
        (
            [server] => Server
            [date] => Date
            [content-type] => Content-Type
            [transfer-encoding] => Transfer-Encoding
            [connection] => Connection
            [x-robots-tag] => X-Robots-Tag
            [link] => Link
            [x-content-type-options] => X-Content-Type-Options
            [access-control-expose-headers] => Access-Control-Expose-Headers
            [access-control-allow-headers] => Access-Control-Allow-Headers
            [allow] => Allow
        )

    [protocol:GuzzleHttp\Psr7\Response:private] => 1.1
    [stream:GuzzleHttp\Psr7\Response:private] => GuzzleHttp\Psr7\Stream Object
        (
            [stream:GuzzleHttp\Psr7\Stream:private] => Resource id #23
            [size:GuzzleHttp\Psr7\Stream:private] => 
            [seekable:GuzzleHttp\Psr7\Stream:private] => 1
            [readable:GuzzleHttp\Psr7\Stream:private] => 1
            [writable:GuzzleHttp\Psr7\Stream:private] => 1
            [uri:GuzzleHttp\Psr7\Stream:private] => php://temp
            [customMetadata:GuzzleHttp\Psr7\Stream:private] => Array
                (
                )

        )

)

标签: phpwordpresslaravelguzzle6

解决方案


嗯,这行得通。

$body_content = json_decode($session->getBody(), true);

$token = $body_content['token'];

我从这里对此有了更好的理解。


推荐阅读