我试图使用RestTemplate来携带cookie并请求一个自定义Wordpress注销接口,但是前端没有注销。当我直接访问浏览器中的注销url时,我能够成功地注销。以下是我的RestTemplate代码:
public void logoutOfWordpress(HttpServletRequest request, HttpServletResponse response) {
Cookie[] cookies = request.getCookies();
String url = wordpressProper.getRestUrl() + "/community-rest/logout";
HttpHeaders httpHeaders = buildHeaderByCookies(cookies);
ResponseEntity<String> exchange = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<>(httpHeaders), String.class);
Object body = exchange.getBody();
}
这是WordPress注销接口:
add_action( 'rest_api_init', 'community_rest_logout');
function community_rest_logout() {
register_rest_route(
'community-rest',
'/logout/',
array(
'methods' => 'GET',
'callback' => 'logout'
)
);
}
function logout() {
wp_logout();
wp_redirect('http://192.168.100.5:8888/sign_in');
exit;
}
我尝试使用Postman调用这个注销接口,发现响应头中有Set-Cookie
。这似乎是登出所必需的。看来,我可以直接将cookie的Max-Age
设置为0
,以实现注销的目的,而不必调用注销接口。
发布于 2022-10-24 09:18:03
您使用什么作为用户登录?在wordpress rest中,会话不会在内部启动。如果用户登录到您的注销端点,您应该能够获得user_id
。你能接这个吗?
通常,nonce用于未注册用户的rest。您需要在标头或参数中发送当前值。对于注册用户,您需要对cookie进行身份验证,或者可以使用一些rest身份验证插件。
对于一个简单的黑客,您可以在端点的顶部使用它:
public function init_cookie() {
$userID = wp_validate_logged_in_cookie(false);
if($userID) {
wp_set_current_user($userID);
}
}
我还建议在类中定义代码或以函数的名称作为前缀。注销函数是一个非常通用的名称。如果这只是一个例子,忽略我所说的。
https://stackoverflow.com/questions/74179367
复制相似问题