使用REST API时未找到用户

时间:2020-09-19 作者:dewd

当我在登录时使用休息路线,并呼叫wp_get_current_user(), 找不到用户。但是,请求方法(例如POST)的处理没有问题。休息路线注册示例。

register_rest_route(
    \'dewd-test-namespace\', //namespace
    \'dewd-test-namespace-test-route\', //route
    [
     \'methods\'=>\'POST\',
     \'callback\'=>[
          $this,   //object of this class
          \'testingUser\' //function
      ] 
    ] //params
);
致电至wp_get_current_user() 返回此用户对象:

WP_User Object
(
    [data] => stdClass Object
        (
        )

    [ID] => 0
    [caps] => Array
        (
        )

    [cap_key] => 
    [roles] => Array
        (
        )

    [allcaps] => Array
        (
        )

    [filter] => 
    [site_id:WP_User:private] => 0
)
即无用户。如果添加了权限回调,例如`

\'permission_callback\' => function () {

     return current_user_can( \'edit_others_posts\' );
 }
401状态随消息“返回”;抱歉,不允许您这样做;。

如果有人知道我需要做什么,我将不胜感激wp_get_current_user() 在REST调用中返回当前用户。

1 个回复
最合适的回答,由SO网友:Hybrid Web Dev 整理而成

发生这种情况是因为您没有使用nonce。由于您没有提供请求的nonce,Wordpress将您视为未经授权/未登录的用户。这是因为wordpress无法知道/验证用户状态。

要使其正常工作,必须生成这样的nonce:

wp_create_nonce( \'wp_rest\' )
并将其提供给正在进行rest呼叫的应用程序。应用程序具有nonce值后,您可以将其添加到rest请求中,如下所示:

headers: {
    \'X-WP-Nonce\': nonce,
}
完成此操作后,Wordpress将能够使用nonce正确验证用户,并且权限的条件检查将按预期工作。

编辑

根据您的评论,我想我会详细说明,因为这些信息可能对将来遇到这一问题的任何人都有用。

nonce定义为使用一次的数字。wordpress是如何使用它们的,以及为什么需要它们,如下所示:

"E;nonce是一个;“使用一次的编号”;帮助保护URL和表单免受某些类型的恶意或其他滥用。WordPress nonce不是数字,而是由数字和字母组成的散列。它们也不是只使用一次,而是有一个有限的;“寿命”;之后到期。在这段时间内,将为给定上下文中的给定用户生成相同的nonce。该操作的nonce对于该用户将保持不变,直到该nonce生命周期完成。

WordPress的安全令牌称为;“nonces”;尽管与真正的nonce存在上述差异,但它们的用途与nonce大致相同。它们有助于抵御包括CSRF在内的多种类型的攻击,但无法抵御重播攻击,因为它们未被检查为一次性使用。不应依赖nonce进行身份验证或授权、访问控制。使用current\\u user\\u can()保护您的函数,始终假定nonce可能会受到危害。

例如,为什么要使用nonce,管理屏幕可能会生成这样一个URL,它会丢弃帖子编号123"E;

TLDR是将nonce与rest请求中提供的用户身份验证cookie结合使用,就像任何服务器端请求一样。Nonces只是提供了一个额外的层,可以依赖它来确保用户是他们所说的那个人。它本身并不是身份验证的替代品。

有关全面的说明,请参阅https://codex.wordpress.org/WordPress_Nonces#:~:text=WordPress%20nonces%20aren\'t%20numbers,user%20in%20a%20given%20context.

相关推荐

为什么GET_USERS()不在管理后端工作?

我不明白为什么get_users() 可在前端工作,但不能在管理后端工作。我相信这在某种程度上是可行的。我的代码:function add_new_user_menu_item() { remove_submenu_page(\'users.php\', \'user-new.php\'); $submenu_title = __( \'Add new\', \'myplugin\' ); add_submenu_page(