WP REST API需要GET端点密码


8

我有一个自定义帖子类型,card该类型通过WP REST API公开。有没有办法要求使用Cookie或Basic Auth标头进行身份验证?我在POST方法块下看到一个用于密码的参数,但是我不确定如何使用它。

在此处输入图片说明

Answers:


9

当我们使用注册一条休息路线时register_rest_route(),则可以使用permission_callback具有所需权限类型的参数。

检查例如如何WP_REST_Posts_Controller::register_routes()WP_REST_Users_Controller::register_routes()执行权限回调。

您所指的password参数是内容的密码,您可以为每个帖子设置该密码,并且该密码是不相同的。

但是由于您要定位现有路线,例如:

/wp/v2/cards
/wp/v2/cards/(?P<id>[\d]+)
/wp/v2/cards/...possibly some other patterns...

您可以尝试使用rest_dispatch_request过滤器(例如,过滤器)为此类路由设置其他权限检查。

这是一个演示插件:

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/*GET路由为目标,并进行了其他用户权限检查。

使用WordPress Cookie身份验证进行调试时,我们可以例如使用以下命令直接对其进行测试:

https://example.tld/wp-json/wp/v2/cards?_wpnonce=9467a0bf9c

随机数部分是从哪里生成的 wp_create_nonce( 'wp_rest' );

希望这可以帮助!


我试图将其用于给定的目标群体,但是也许有更简单的方法可以解决此问题?我添加了一个功能示例作为内联注释@MarkKaplun
birgire

也许更简单的方法是使用register_post_type_args过滤器和e(例如,$args['show_in_rest'] = is_user_logged_in();为给定帖子类型或基于设置)来删除给定自定义帖子类型的端点$args['rest_base']。不知道这是想要的还是推荐的;-)
birgire

3

您看到的“密码”字段实际上不是用于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_private_posts”功能的用户帐户可见,该功能默认情况下仅限于管理员和编辑者角色。(注意:“私人”仅将帖子内容设为私人,其标题仍可以公开。)

当您创建自定义帖子类型时,相同的功能会映射到您类型的复数形式(使用plural_base)。因此,对于帖子类型的卡片,如果需要,可以使用类似的“ read_private_cards”权限分配给用户角色。

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

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

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

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

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.