web-dev-qa-db-de.com

Der Aufruf von wp_signon meldet den Benutzer nicht an

Momentan programmiere ich einen Single Sign-On-Mechanismus für meine Wordpress-Site, damit sich das Helpdesk-System meines Unternehmens bei Wordpress authentifizieren kann.

Um dies zu ermöglichen, benutze ich wp_signon (), um den Benutzer anzumelden, falls er noch nicht angemeldet ist. Hier ist eine vereinfachte Version von dem, was ich tue:

<?php
define('WP_USE_THEMES', false);
require("wp-blog-header.php");

if(!is_user_logged_in() && $_POST["log"] == "") {
    //redirect to login form that submits to this PHP script
    exit(0);
}

if(!is_user_logged_in() && $_POST["log"] != "") {
    $creds = array('user_login' => $_POST["log"], 'user_password' => $_POST['pwd'], 'remember' => $_POST["rememberme"]);
    $user_info = wp_signon($creds, false);

    if(!is_a($user_info, 'WP_Error')) {
        $username = $_POST["log"];
        wp_set_current_user($user->ID, $username);
        wp_set_auth_cookie($user->ID, true, false); 
        do_action('wp_login', $username);
    } else {
        write_log(ERROR, "Error authenticating: " . $user_info->get_error_message($user_info->get_error_code()));
    }

$user_info = wp_get_current_user();

/* Code from here uses user attributes to generate and encrypt a single sign-on token */
?>

Das Problem ist, dass der Benutzer auch nach dem Aufrufen von wp_signon(), wp_set_current_user(), wp_set_auth_cookie() und den Anmeldeaktionen noch nicht angemeldet ist. Ich erhalte das Objekt $ user_info, aber sie sind nicht in Wordpress angemeldet, also später, wenn Sie folgen einem gesicherten Link vom Support-System zurück, können die Seite nicht aufrufen und müssen sich erneut anmelden (was den Zweck des einmaligen Anmeldens außer Kraft setzt).

Außerdem habe ich versucht, den gesamten Abschnitt wp_signon() durch auth_redirect() zu ersetzen. Dadurch wird der Benutzer erfolgreich auf der Site angemeldet, aber es wird festgestellt, dass er auf die Profilseite umgeleitet wird, obwohl die URL einen Abfrageparameter hat, mit dem er zurückgeleitet werden kann zu meinem Drehbuch.

2
Adrian

Sie müssen sicherstellen, dass Ihr Code ausgeführt wird, bevor auth_redirect() aufgerufen wird.

Mit einfachen Worten, Sie müssen die gesamte Funktion mit der Aktion setup_theme verknüpfen. In meinem Fall hat es funktioniert.

2