Можно ли передать сеанс WordPress в другой браузер через строку запроса?

Предполагая, что пользователь имеет существующий сеанс WordPress, можно ли использовать cookie 'wordpress_logged_in_ [hash]', закодировать его в строке запроса и возобновить сеанс в другом браузере?

Конкретный пример использования, который я изучаю, - это если пользователь выполнил вход в мое мобильное приложение, я хотел бы предоставить им возможность открыть страницу WordPress, которую они просматривают в веб-браузере во внешнем браузере, не теряя сессии.

7 голосов | спросил Jacob Tabak 3 Jpm1000000pmSat, 03 Jan 2015 22:28:55 +030015 2015, 22:28:55

1 ответ


4

Здесь (с некоторым трепетом) представлен эскиз решения с однократной ссылкой, которое может быть достаточно безопасным, если можно зависеть от того, насколько ip довольно постоянный (по крайней мере, в краткосрочной перспективе) на телефоне, используя запрос var и переход на основе $_SERVER['REMOTE_ADDR'], хотя как @Wyck и @G. М. говорят, что любой такой бэкдор представляет собой риск для безопасности ...

// Make query var & transient name unique to site url and user's IP.
$siteurl = get_site_option( 'siteurl' );
// Could use eg $siteurl = COOKIEHASH; if handier for mobile app.
// Other stuff such as $device_id would be good if available.
define( 'WPSE173878', 'wpse173878' . md5( $siteurl . $_SERVER['REMOTE_ADDR'] ) );

add_action( 'init', function () {
    if ( is_user_logged_in() ) {
        if ( wpse173878_is_set_transient() ) {
            $time = time();
            wpse173878_set_transient( $time );
            // For testing output link in footer.
            add_action( 'wp_footer', function () use ( $time ) {
                // Could just use time() instead as check fudged below in check_transient().
                $link = add_query_arg( WPSE173878, $time, home_url( '/' ) );
                echo '<a href="' . esc_attr( $link ) . '">Copy into a browser</a>';
            } );
        }
        add_action( 'clear_auth_cookie', function() { delete_transient( WPSE173878 ); } );
    } else {
        if ( isset( $_GET[WPSE173878] ) ) {
            wpse173878_check_transient();
        }
    }
} );

// Set transient.
function wpse173878_set_transient( $time ) {
    $user_id = get_current_user_id();
    $remember = wpse173878_remember( $user_id );
    // Will be compromised if ip changes...
    set_transient( WPSE173878, array( $user_id, $time, $remember ), 1 * MINUTE_IN_SECONDS );
}

// Check transient and login.
function wpse173878_check_transient() {
    if ( list( $user_id, $time, $remember ) = get_transient( WPSE173878 ) ) {
        // Fudge time test so that it's estimatable by mobile app.
        if ( $_GET[WPSE173878] + 5 >= $time && $_GET[WPSE173878] - 5 <= $time ) {
            delete_transient( WPSE173878 );
            if ( $user = get_user_by( 'id', $user_id ) ) {
                // Login.
                wp_set_auth_cookie( $user->ID, $remember );
                // Might want to do_action( 'wp_login', $user->user_login, $user );
            }
        }
    }
    // Redirect regardless.
    wp_redirect( remove_query_arg( WPSE173878, wp_unslash( $_SERVER['REQUEST_URI'] ) ) );
    exit;
}

// Whether to set transient.
function wpse173878_is_set_transient() {
    if ( wpse173878_is_in_webview() && ! is_admin() ) {
        // Other conditions such as user pressed button are necessary.
        return true;
    }
    return false;
}

// Are we in a webview?
function wpse173878_is_in_webview() {
    // Pretend Firefox is webview for testing.
    return strpos( $_SERVER['HTTP_USER_AGENT'], 'Firefox' ) !== false;
}

// From "wp-includes/user.php" wp_update_user().
function wpse173878_remember( $user_id ) {
    // Here we calculate the expiration length of the current auth cookie and compare it to the default expiration.
    // If it's greater than this, then we know the user checked 'Remember Me' when they logged in.
    $logged_in_cookie    = wp_parse_auth_cookie( '', 'logged_in' );
    /** This filter is documented in wp-includes/pluggable.php */
    $default_cookie_life = apply_filters( 'auth_cookie_expiration', ( 2 * DAY_IN_SECONDS ), $user_id, false );
    return ( ( $logged_in_cookie['expiration'] - time() ) > $default_cookie_life );
}
ответил bonger 6 Jam1000000amTue, 06 Jan 2015 02:15:43 +030015 2015, 02:15:43

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132