WP REST API需要获取终结点的密码

时间:2017-05-01 作者:YarGnawh

我有一个自定义的帖子类型,card, 我通过WP REST API公开的。有没有办法要求使用cookie或基本身份验证标头进行身份验证?我在POST方法块下看到了一个参数作为密码,但我不知道如何使用它。

enter image description here

2 个回复
最合适的回答,由SO网友:birgire 整理而成

当我们向注册rest路由时register_rest_route(), 然后我们可以使用permission_callback 具有所需权限类型的参数。

例如,检查如何WP_REST_Posts_Controller::register_routes()WP_REST_Users_Controller::register_routes() 实现权限回调。

您所指的密码参数是内容的密码,您可以为每篇文章设置密码,但密码不同。

但由于您希望以现有路线为目标,例如:

/wp/v2/cards
/wp/v2/cards/(?P<id>[\\d]+)
/wp/v2/cards/...possibly some other patterns...
你可以试试,例如rest_dispatch_request 筛选以设置这些类型路由的附加权限检查。

Here\'s a demo plugin:

add_filter( \'rest_dispatch_request\', function( $dispatch_result, $request, $route, $hndlr )
{
    $target_base = \'/wp/v2/cards\';    // Edit to your needs

    $pattern1 = untrailingslashit( $target_base ); // e.g. /wp/v2/cards
    $pattern2 = trailingslashit( $target_base );   // e.g. /wp/v2/cards/

    // Target only /wp/v2/cards and /wp/v2/cards/*
    if( $pattern1 !== $route && $pattern2 !== substr( $route, 0, strlen( $pattern2 ) ) )
        return $dispatch_result;

    // Additional permission check
    if( is_user_logged_in() )  // or e.g. current_user_can( \'manage_options\' )
        return $dispatch_result;

    // Target GET method
    if( WP_REST_Server::READABLE !== $request->get_method() ) 
        return $dispatch_result;

    return new \\WP_Error( 
        \'rest_forbidden\', 
        esc_html__( \'Sorry, you are not allowed to do that.\', \'wpse\' ), 
        [ \'status\' => 403 ] 
    );

}, 10, 4 );
我们的目标是/wp/v2/cards/wp/v2/cards/* 获取路由,并进行其他用户权限检查。

使用WordPress cookie身份验证进行调试时,我们可以直接使用以下工具进行测试:

https://example.tld/wp-json/wp/v2/cards?_wpnonce=9467a0bf9c
其中nonce部分是从wp_create_nonce( \'wp_rest\' );

希望这有帮助!

SO网友:Otto

您看到的“密码”字段实际上不是针对REST API的,而是针对Post条目本身的。WordPress中的个别帖子可以使用密码保护,因此您需要使用密码才能查看其内容。

这种形式的个人帖子密码不是一种强大的密码机制,它是一种共享密码。所有用户的密码都是相同的,并且未加密和未加密地存储在数据库中。无论如何,它都不是一种安全机制,它是一种以简单方式隐藏内容的简单机制。

如果您想在REST API中使用此机制,那么这是可能的。例如,如果单个帖子的ID为123,则可以如下方式检索帖子:

http://example.com/wp-json/wp/v2/posts/123

如果该帖子受密码保护,则此URL将检索该帖子:

http://example.com/wp-json/wp/v2/posts/123?password=example-pass

参考号:https://developer.wordpress.org/rest-api/reference/posts/#retrieve-a-post

如果您需要更强大的、基于用户的身份验证,那么WordPress提供了一种将帖子设置为“私有”的方法。此设置使帖子仅对具有“read\\u private\\u posts”功能的用户帐户可见,默认情况下,该功能仅限于管理员和编辑器角色。(注意:Private只会将帖子内容设置为私有,标题仍然可以公开。)

创建自定义帖子类型时,此功能将映射到类型的复数形式(使用复数\\u base)。因此,对于post类型的卡,如果需要,您可以使用类似的“read\\u private\\u cards”权限分配给用户角色。

现在,用户级别的身份验证实际上并没有内置到REST API中。标准的基于WordPress cookie的auth工作正常,但是API没有提供获取cookie的方法。如果它存在,它将接受它,但您必须执行正常的登录流才能获得这样的cookie。如果您需要其他身份验证方法,那么需要一个插件。

有四个这样的插件。这些是OAuth 1.0、应用程序密码、JSON Web令牌和基本身份验证插件。请注意,基本身份验证最简单,但也不安全,因此建议仅用于测试和开发目的。不应在实时生产服务器上使用它。

您可以在此处找到有关这些插件的更多信息:

https://developer.wordpress.org/rest-api/using-the-rest-api/authentication/#authentication-plugins