这实际上不是问题,而是有关如何使用JWT向Wordpress API进行经过身份验证的请求的指南。我写这封信是为了提醒我自己以及那些可能在同一主题上需要帮助的人。
这实际上不是问题,而是有关如何使用JWT向Wordpress API进行经过身份验证的请求的指南。我写这封信是为了提醒我自己以及那些可能在同一主题上需要帮助的人。
Answers:
为什么进行JWT身份验证
我正在建立一个使用Wordpress作为后端,并使用React + Redux应用程序作为前端的网站,所以我通过向Wordpress API发出请求来提取前端中的所有内容。一些请求(主要是POST请求)必须经过身份验证,这是我遇到JWT时的身份。
我们需要的
要将JWT身份验证与Wordpress一起使用,我们首先需要为WP REST API插件安装JWT身份验证。如插件说明中所述,我们还需要修改一些核心Wordpress文件。尤其是:
在Wordpress安装的根文件夹中包含的.htaccess文件中,我们需要添加以下行:
RewriteEngine on
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
在wp-config.php文件(也包含在Wordpress安装的根文件夹中)中,我们需要添加以下行:
define('JWT_AUTH_SECRET_KEY', 'your-top-secret-key'); // Replace 'your-top-secret-key' with an actual secret key.
define('JWT_AUTH_CORS_ENABLE', true);
测试以查看JWT是否可用
为了验证我们现在可以使用JWT,启动Postman并向Wordpress API的默认“索引”发出请求:
http://example.com/wp-json/
一些新的端点,例如/jwt-auth/v1
和/jwt-auth/v1/token
应该已经添加到API。如果在上述请求的响应中可以找到它们,则意味着JWT现在可用。
获取JWT令牌
让我们暂时留在Postman中,让我们向Wordpress API请求令牌:
http://example.com/wp-json/jwt-auth/v1/token
响应将包含JWT令牌,该令牌是一个加密密钥,看起来像这样:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9sb2NhbGhvc3Q6ODg4OFwvZm90b3Jvb20tbmV4dCIsImlhdCI6MTUyMjU5NzQ1MiwibmJmIjoxNTIyNTk3NDUyLCJleHAiOjE1MjMyMDIyNTIsImRhdGEiOnsidXNlciI6eyJpZCI6IjEifX19.hxaaT9iowAX1Xf8RUM42OwbP7QgRNxux8eTtKhWvEUM
进行身份验证的请求
让我们尝试更改ID为300的帖子标题,以使用JWT进行身份验证的请求为例。
在邮递员中,选择POST作为方法,然后键入以下端点:
http://example.com/wp-json/wp/v2/posts/300
在“授权”选项卡中选择“无身份验证”,然后在“标题”选项卡中添加以下内容:
'Content-type': 'application/json',
'Authorization': 'Bearer jwtToken' // Replace jwtToken with the actual token (the encrypted key above)
最后,在“正文”选项卡中,选择raw和JSON(application / json)选项,然后在选项下方的编辑器中键入以下内容:
{ "title": "YES! Authenticated requests with JWT work" }
现在您可以点击发送。在“响应”选项卡中查看有关我们请求的帖子的所有数据:标题键的值现在应为YES! Authenticated requests with JWT work
register_rest_route( 'jwt-auth/v1', 'your_custom_endpoint ...
。/ jwt-auth /下的所有内容都需要授权
补充@grazianodev的答案,这是使用cURL获取授权令牌的方式:
/**
* Generate a JWT token for future API calls to WordPress
*/
private function getToken() {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,'https://site.localhost/wp-json/jwt-auth/v1/token');
curl_setopt($ch, CURLOPT_POST, 1);
# Admin credentials here
curl_setopt($ch, CURLOPT_POSTFIELDS, "username=admin&password=Str0ngPass");
// receive server response ...
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$server_output = curl_exec ($ch);
if ($server_output === false) {
die('Error getting JWT token on WordPress for API integration.');
}
$server_output = json_decode($server_output);
if ($server_output === null && json_last_error() !== JSON_ERROR_NONE) {
die('Invalid response getting JWT token on WordPress for API integration.');
}
if (!empty($server_output->token)) {
$this->token = $server_output->token; # Token is here
curl_close ($ch);
return true;
} else {
die('Invalid response getting JWT token on WordPress for API integration.');
}
return false;
}
之后,发送带有标题的请求:“授权:承载$ token”
其中$ token是上面的getToken()函数返回的令牌。
我个人使用插件“ 禁用REST API并要求JWT / OAuth身份验证 ”来仅通过上述令牌来限制API访问。