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

评论

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

还有一个很好的指南firxworx.com/blog/wordpress / ...

#1 楼

为什么要进行JWT身份验证

我正在构建一个使用Wordpress作为后端,并使用React + Redux应用程序作为前端的网站,所以我将所有内容都放在前端-通过向Wordpress API发出请求来结束。我遇到JWT时,某些请求(主要是POST请求)必须经过身份验证。

我们需要什么

要在Wordpress中使用JWT身份验证,我们首先需要安装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令牌,它是一个加密的密钥,看起来像这样:




制作/>通过身份验证的要求

让我们尝试变更文章的标题与300的ID为使用JWT进行身份验证的请求的示例。

在Postman中,选择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(应用程序/ json)选项,然后在选项下方的编辑器中键入以下内容:

{ "title": "YES! Authenticated requests with JWT work" }


现在您可以点击发送。在“响应”选项卡中查找有关我们请求的帖子的所有数据:标题键的值现在应为YES! Authenticated requests with JWT work

评论


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

–uruk
18年7月11日在20:59

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

–克里斯
18年7月12日在11:07

@chris如果您希望将端点隐藏在未经授权的请求之外,则将它们添加到名称空间jwt_auth下,即像这样:register_rest_route('jwt-auth / v1','your_custom_endpoint ...。/ jwt-auth /下的任何内容需要授权

– Athoxx
19-09-19在20:39

@uruk一旦有了JWT令牌,我认为您可以随时发送它,因此您无需区分需要哪个令牌和不需要哪个令牌。

–Lai32290
20年5月2日,10:38

如我所见,此插件尚未更新很长时间,仍然可以安全使用吗?

–Lai32290
20年5月2日,10:39

#2 楼

补充@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仅使用上面的令牌访问。