javascript 在REST API中使用仅限HTTP的Cookie,确定Cookie“所有者”

soat7uwm  于 2023-10-14  发布在  Java
关注(0)|答案(1)|浏览(101)

我正在Wordpress中构建一个REST API,并希望使用安全Cookie进行身份验证。
我的问题是服务器如何确定cookie的所有者,以及需要从客户端传递哪些数据才能为该客户端检索cookie?
我可以在服务器上设置cookie,但在下一次调用时,客户端的cookie无法访问。我假设需要传递某种类型的头,以便服务器识别设置cookie的是同一个用户。
我真的没有一些代码要展示,因为问题更一般地是服务器识别客户端和访问安全cookie所需的内容,但基本上我想做的是:
JavaScript语言:

function setCookie() {
    const res = await fetch('/login', {username, password});
    
    console.log(await res.json()); // Success
}

function checkCookie() {
    const res = await fetch('/check-cookie');
    
    console.log(await res.json()); // False
}

PHP:

<?php

// Hooked to /login endpoint
function login($request) {
    // Check credentials, then set cookie:
    $cookie = setCookie('cookie-name', 'some-value', 0, '/', '', true, true);

    return $cookie ? 'Success' : 'Failed';
}

// Hooked to /check-cookie endpoint
function checkCookie() {
    return isset($_COOKIE['cookie-name']);
}

因此,第一次登录在我的尝试是成功的,但检查任何其他请求的身份验证是不成功的。

pengsaosao

pengsaosao1#

免责声明:使用cookie auth而不使用nonce会受到CSRF攻击,不建议使用!

要通过API使用标准会话cookie,您只需start_session(),验证用户并将其user_id保存在$_SESSION中,使其成为每个额外请求的当前用户。

add_action('rest_api_init', function () {
    register_rest_route('custom/v1', '/login/', [
        'methods' => 'POST',
        'callback' => 'customLogin',
        'permission_callback' => '__return_true',
    ]);
});

add_action('rest_api_init', function () {
    register_rest_route('custom/v1', '/check-cookie/', [
        'methods' => 'GET',
        'callback' => 'checkCookie',
        'permission_callback' => 'userOk',
    ]);
});

// Hooked to /login endpoint
function customLogin(\WP_REST_Request $request) {
    session_start();

    $user = wp_signon([
        'user_login' =>  $request->get_param('user_login'), 
        'user_password' =>  $request->get_param('user_password')
    ]);

    if(isset($user->ID)) {
        $_SESSION['user_id'] = $user->ID;
        return true;
    } elseif(isset($_SESSION['user_id'])) {
        unset($_SESSION['user_id']);
    }

    return $user;
}

// Hooked to /check-cookie endpoint
function checkCookie() {
    $data = [
        "message" => "YOU ARE IN!"
    ];

    return $data;
}

// Callback to check whether user is allowed to do certain things
function userOk() {
    session_start();

    if(!isset($_SESSION['user_id'])) {
        return false;
    }

    $user = get_user_by('id', $_SESSION['user_id']); 
    if(isset($user->ID)) {
        wp_set_current_user($user->ID, $user->user_login);
    }
    
    return current_user_can('edit_posts');
}

这应该可以让你开始。如果您不想干扰常规会话cookie(和/或只想设置HTTP),请为session_start()添加适当的选项。再次:我不建议这样做!

相关问题