php - 在 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
(
)
)
)
解决方案
嗯,这行得通。
$body_content = json_decode($session->getBody(), true);
$token = $body_content['token'];
我从这里对此有了更好的理解。
推荐阅读
- node.js - 使用 jsdom 解析 html 文件正文
- amazon-web-services - AWS ELB 从 Fastly 健康检查中获得大量 404 错误
- java - 使用文件路径保存 HashMap
- powershell - 当我尝试通过 TFS Build 运行时,Powershell 脚本未安装 exe
- kubernetes - 通过 DNS ping 有状态集的 pod
- angular - 如何在新行中显示 Kendo-chart-title
- python - Django:按多个ID过滤查询集
- java - 单击停止按钮后 TimerTask 没有停止
- swift - 在计算属性中设置新值
- r - R识别数据框中的第一个值并通过从新列的数据框中的所有值中添加/减去该值来创建新变量