通过Wordpress REST API访问$_SESSION,凭据包括

sxissh06  于 2023-04-20  发布在  WordPress
关注(0)|答案(1)|浏览(125)

我有一个存储在$_SESSION变量中的第三方API的会话令牌,并希望能够在WP Rest请求中访问它。我可以使用WP Rest内置的Nonce authentication来实现这一点吗?
首先,我为脚本创建一个wp_rest nonce和l10n

$params = array(
  'nonce' => wp_create_nonce( 'wp_rest' )
);
wp_localize_script( 'my_script', 'user_tools', $params );

请求如下:

on('submit', '#mzStudioRegisterForm', function (event) {
  event.preventDefault();
  let form = event.target;
  let data = new FormData(form);
  data.append('_wpnonce', user_tools.nonce);
 fetch(base_url + `registeruser?`, {method: 'POST', body: data, credentials: 'include'})
  .then(r => r.json())
  .then(json => console.log({"json": json}));
});

休息路线和回调最小:

function register_user_with_studio() {
  // An example with 0 parameters.
  register_rest_route(
    'myplugin-auth/v1',
    '/registeruser',
    array(
      'methods'             => \WP_REST_Server::CREATABLE,
      'callback'            => __NAMESPACE__ . '\register_user',
      'permission_callback' => '__return_true'
    )
  );
}

回调:

function add_user_to_studio( $request ) {
  $params = $request->get_body_params();
  // This is where I want to get the token from $_SESSION
  return array( 'result' => 'Salaam. I can hear you.' );
}

WP随机数身份验证是否仅适用于登录到WP的用户?
在Dev Tools中,请求本身似乎正在发送cookie:

:authority: example.test
:method: POST
:path: /wp-json/myplugin-auth/v1/registeruser?
:scheme: https
accept: */*
(abridged)
content-type: multipart/form-data; boundary=----WebKitFormBoundaryoiTG77MAuyEduz00
cookie: PHPSESSID=8f4b03d3eaa814644ef29f7fea711a83
dnt: 1
origin: https://example.test
pragma: no-cache
sec-ch-ua: "Chromium";v="112", "Google Chrome";v="112", "Not:A-Brand";v="99"
sec-fetch-dest: empty
sec-fetch-mode: cors
sec-fetch-site: same-origin
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)

并在后端匹配:

session_id();
// 8f4b03d3eaa814644ef29f7fea711a83
rhfm7lfc

rhfm7lfc1#

在引用的WP文档中错过了这一点:
请务必记住,此身份验证方法依赖于WordPress Cookie。因此,此方法仅适用于在WordPress内部使用REST API且当前用户已登录的情况。此外,当前用户必须具有执行所执行操作的相应能力。
因此,我们正在做的是,至少在目前,过滤rest_authentication_headers,并在确定不存在WP_Error时返回true:

add_filter( 'rest_authentication_errors', function( $result ) {
  if ( true === $result || is_wp_error( $result ) ) {
    return $result;
  }

  return true;
});

老实说,我不完全相信这不会产生任何安全漏洞,我想知道,看看WP_Rest_server serve_request方法的第一部分,如果Application Password身份验证更可取。
欢迎输入。

相关问题