我有一个存储在$_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
1条答案
按热度按时间rhfm7lfc1#
在引用的WP文档中错过了这一点:
请务必记住,此身份验证方法依赖于WordPress Cookie。因此,此方法仅适用于在WordPress内部使用REST API且当前用户已登录的情况。此外,当前用户必须具有执行所执行操作的相应能力。
因此,我们正在做的是,至少在目前,过滤rest_authentication_headers,并在确定不存在
WP_Error
时返回true:老实说,我不完全相信这不会产生任何安全漏洞,我想知道,看看WP_Rest_server serve_request方法的第一部分,如果Application Password身份验证更可取。
欢迎输入。