【问题标题】:WP Rest API custom endpoint returning false on GET and POSTWP Rest API 自定义端点在 GET 和 POST 上返回 false
【发布时间】:2021-04-05 11:02:58
【问题描述】:

我有一个用户元的自定义端点,我已成功注册到 WP REST API 并为其创建了一个自定义端点。但是,每当我从我的单页应用程序(使用的 JS 框架是 Vue)发出 GET 和 POST 请求时,返回值为“false”。

我怀疑这是由于使用 JWT Authorization for WP REST API 插件的一些授权问题而发生的。

这是我在 functions.php 应用程序中采取的步骤:

首先我为 REST API 注册用户元字段:


//register user meta to rest api 
add_action( 'rest_api_init', 'adding_user_meta_rest' );

function adding_user_meta_rest (){
    register_meta(
     'user',
     'user_likes',
     array(
         'single'       => false,
         'type'         => 'object',
         'show_in_rest' => true,
     )
 );
};

此步骤似乎工作正常,因为当我使用路径“/wp-json/wp/v2/users/”时显示该字段。

下一步,我注册自定义端点:

add_action('rest_api_init','add_user_likes');

function add_user_likes(){
    register_rest_route(
    'v1/user_likes','/(?P<id>\d+)',[[
        'methods'=> 'GET',
        'callback'=>'get_user_likes'
    ],
    [
        'methods'=> 'POST',
        'callback'=>'post_user_likes'
    ]]);
};

这是我的回调:

function get_user_likes(){
    $current_user_id = get_current_user_id();
    $status = $response->get_status;
    return get_user_meta($current_user_id,'user_likes');
}
function post_user_likes(WP_REST_Request $req){
    $body = $req->get_json_params();
    $current_user_id = get_current_user_id();
    return update_user_meta($current_user_id, 'user_likes',$body);
};

然后在前端,这是我的 POST 请求:

handleLike(){
      fetch(`https://site-url.com/wp-json/v1/user_likes/${this.$store.state.userInfo.id}`,{
        method:"POST",
        body:JSON.stringify({
          post_id:this.currentPost.id,
          post_title:this.currentPost.title.rendered
        }),
         headers: {
          "Content-Type": "application/json",
          "Authorization": `Bearer ${this.$store.state.accessToken}`
        },
      }).then(resp=>resp.json())
      .then(data=>console.log(data)) 

我的 GET 请求也返回 false。

我认为问题在于我没有检索当前用户 ID,因为根据 get_user_meta 和 update_user_meta 的文档,如果未确定用户 ID,该函数将返回 false。为什么没有确定用户ID,我不知道。 正如我所提到的,我正在使用 JWT Authorization for WP REST API。因此,根据我的阅读,我不需要生成随机数,因为 WP 将使用令牌来确定当前用户。让我知道我是否错了。 任何指导将不胜感激。

【问题讨论】:

    标签: php wordpress jwt fetch wordpress-rest-api


    【解决方案1】:

    解决了我的问题。对于使用 JWT Authorization For WP REST API 并在 AWS Lightsail 上托管他们的 Wordpress 数据库的未来用户,以下是 .htaccess 文件必须如何存储在 Bitnami 的 SSH 上:

    <Directory "/opt/bitnami/apps/wordpress/htdocs”>
    <IfModule mod_rewrite.c>RewriteEngine on
    RewriteCond %{HTTP:Authorization} ^(.*)
    RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
    </IfModule>
    </Directory>
    SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
    

    我遇到的第二个问题:令牌已经是一个字符串。因此,将它放在模板文字中会导致解析问题。使用简单的连接就可以了。

    以下是我在 header 中对授权所做的更改(注意:这是使用 Vue 的 Vuex):

    "Authorization": "Bearer" + this.$store.state.accessToken
    

    【讨论】:

      【解决方案2】:

      试试这个,设置credentials &amp; headers如示例:

      method: 'POST',
            credentials: 'same-origin',
            headers: {
              'Content-Type': 'application/x-www-form-urlencoded',
              'Cache-Control': 'no-cache',
            },
            body: params
          })
      

      可以通过将其添加到functions.php来管理corse

      function my_customize_rest_cors() {
          remove_filter( 'rest_pre_serve_request', 'rest_send_cors_headers' );
          add_filter( 'rest_pre_serve_request', function( $value ) {
              header( 'Access-Control-Allow-Origin: *' );
              header( 'Access-Control-Allow-Methods: POST, GET' );
              header( 'Access-Control-Allow-Credentials: true' );
              header( 'Access-Control-Expose-Headers: Link', false );
              header( 'Access-Control-Allow-Headers: X-Requested-With' );
              return $value;
          } );
      }
      
      add_action( 'rest_api_init', 'my_customize_rest_cors', 15 );
      

      【讨论】:

      • 不走运。这会导致 CORS 错误:“跨域请求被阻止:同源策略不允许读取 site.com/wp-json/v1/user_likes/18 上的远程资源。(原因:不允许标头“缓存控制”根据 CORS 预检响应中的标题“Access-Control-Allow-Headers”)。”
      • 我试图找到一个原因,但现在 CORS 错误正在输出“原因:根据 CORS 预检响应中的标头 'Access-Control-Allow-Headers' 不允许标头'授权'”而不是“缓存控制”。我假设我仍然需要 Headers 对象中的 Authorization 字段,对吗?
      • 我添加了“header('Access-Control-Allow-Headers: Authorization, Cache-Control');”。我的 COR 错误消失了,但现在“错误”返回已返回。
      • 好的,我在这里运行了邮递员测试:stackoverflow.com/questions/42381521/… 并注意到我的身份验证令牌不起作用。我想我需要处理我的配置文件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-05
      • 1970-01-01
      • 2020-02-06
      • 1970-01-01
      • 2017-09-09
      • 2020-04-01
      • 1970-01-01
      相关资源
      最近更新 更多