如何:向Wordpress API进行JWT身份验证的请求


17

这实际上不是问题,而是有关如何使用JWT向Wordpress API进行经过身份验证的请求的指南。我写这封信是为了提醒我自己以及那些可能在同一主题上需要帮助的人。


3
您应该将此格式设置为问题,然后将解决方案发布为实际答案。否则,它看起来像是一个未解决的问题。
雅各布·皮蒂

2
还有一个很好的指南firxworx.com/blog/wordpress/…–
Armando

Answers:


19

为什么进行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


2
您如何区分必须进行身份验证的呼叫和不需要在后端进行身份验证的呼叫?
uruk

我还在构建一个React应用程序,该应用程序使用WordPress REST API从WordPress数据库中提取帖子数据,但是,我不想公开REST API端点。除了我的React应用程序,是否有其他方法可以限制对REST API的访问?
克里斯(Chris)

@克里斯如果你希望你的端点被隐藏从非授权的请求了,将它们添加在命名空间jwt_auth,即像这样:register_rest_route( 'jwt-auth/v1', 'your_custom_endpoint ... 。/ jwt-auth /下的所有内容都需要授权
-Athoxx

4

补充@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访问。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.