Skip to content

Kaikki WordPressistä, web-kehityksestä — ja paljon muuta

🚀 Automaattinen WordPress-kirjautuminen PHP:llä: koodinpätkä demokäyttöön

🚀 Automaattinen WordPress-kirjautuminen PHP:llä: koodinpätkä demokäyttöön

Demokäyttö WordPressin hallintapaneeliin on vakiintunut tapa myydä lisäosia ja teemoja. Mahdollinen ostaja vierailee sivustolla, näkee tunnuksen ja salasanan, kopioi ne, siirtyy wp-login.php:hen, liittää... Liian monta vaihetta. Jokainen ylimääräinen klikkaus karsii osan yleisöstä.

Automaattinen kirjautuminen linkin kautta ratkaisee tämän ongelman radikaalisti: yksi linkki, ja käyttäjä on jo hallintapaneelissa, halutulla tunnuksella. Ei kopioi-liitä -rumbaa, ei sekaannusta kirjautumistietojen kanssa.

Alla on valmis PHP-pätkä, joka lisää tämän mekanismin mihin tahansa WordPress-sivustoon. Kaksikymmentä riviä koodia, räätälöintiin menee 2 minuuttia. Pätkä ei riipu teemasta, ei vedä mukaan ulkoisia riippuvuuksia ja aktivoituu kuten tavallinen lisäosa.

💡 Nopea yleiskatsaus:

  • Lisäät URL-parametrin kirjautumisosoitteeseen (esimerkiksi ?autologin=demo), ja wp_signon() kirjaa käyttäjän sisään määritetyllä tunnuksella ja ohjaa haluttuun osioon
  • Pätkä on muotoiltu erilliseksi WordPress-lisäosaksi: aktivoi se, ja se toimii heti; deaktivoi se, ja se poistuu käytöstä; teema ei ole sidoksissa siihen
  • Perusversio palvelee yhtä tunnusta, laajennettu versio tukee mitä tahansa määrää tunnuksia eri rooleilla ja kohdepisteillä
  • Räätälöinti projektiisi: vaihda kolme arvoa koodissa (tunnus, salasana, URL-avain), lataa lisäosa sivustolle ja saat kirjautumisen linkin kautta

Miten automaattinen kirjautuminen toimii: wp_signon-mekaniikka

Koko rakenteen ydin on wp_signon()-funktio. Se ottaa vastaan kirjautumistiedot: tunnuksen, salasanan ja "muista minut" -lipun, ja kirjaa sitten käyttäjän sisään täsmälleen kuten vakiolomake wp-login.php:ssä. Ero on siinä, että kutsu tapahtuu ohjelmallisesti, ilman ihmisen osallistumista. Käyttäjä yksinkertaisesti seuraa linkkiä ja päätyy sisälle.

after_setup_theme-koukku laukeaa ennen otsakkeiden lähetystä, mikä on kriittistä, koska wp_signon() asettaa auth-evästeen, ja evästeet on lähetettävä ennen mitään tulostusta selaimeen. Jos ripustat kutsun init-koukkuun tai myöhempään, kirjautuminen ei välttämättä toimi. Juuri siksi pätkä on muotoiltu erilliseksi lisäosaksi eikä lisätyksi teeman functions.php-tiedostoon: lisäosa latautuu WordPressin elinkaaren hyvin varhaisissa vaiheissa, mikä takaa, että koukku suoritetaan ajoissa.

Täydellinen koodi WordPressin automaattisen kirjautumisen lisäosalle

Tässä on minimaalinen toimiva lisäosa:

1<?php
2/*
3Plugin Name: Auto Login
4Plugin URI: https://techblog.sdstudio.top/
5Version: 1.0.0
6Author: Harri Bell-Thomas
7*/
8
9function autologin() {
10 if ( $_GET['autologin'] !== 'demo' ) {
11 return;
12 }
13
14 $creds = array(
15 'user_login' => 'demo',
16 'user_password' => 'demo',
17 'remember' => true,
18 );
19
20 $user = wp_signon( $creds, false );
21
22 if ( ! is_wp_error( $user ) ) {
23 wp_redirect( admin_url() );
24 exit;
25 }
26}
27add_action( 'after_setup_theme', 'autologin' );

Puretaan se rivi riviltä. Ehto $_GET['autologin'] === 'demo' tarkistaa, että vaadittu parametri on välitetty URL:ssä: wp-login.php?autologin=demo. $creds-taulukko sisältää tunnuksen, salasanan ja "muista minut" -lipun. wp_signon() parametrilla false tarkoittaa: älä käytä suojattua evästettä (sopii paikalliseen kehitykseen ja staging-sivustoille ilman HTTPS:ää). Onnistuessaan wp_redirect( admin_url() ) ohjaa käyttäjän hallintapaneeliin. Virhetilanteessa (väärä salasana, olematon käyttäjä) WordPress näyttää vakio-kirjautumislomakkeen paljastamatta, että automaattista kirjautumista yritettiin.

Räätälöinti projektiisi

Pätkän mukauttamiseen riittää kolmen arvon vaihtaminen: URL-parametri, tunnus ja salasana. Seuraavassa lohkossa ne on siirretty funktion alkuun mukavuussyistä:

1function autologin() {
2 $param = 'autologin';
3 $user = 'dummy';
4 $pass = 'pa55word';
5
6 if ( $_GET[ $param ] !== $user ) {
7 return;
8 }
9
10 $creds = array(
11 'user_login' => $user,
12 'user_password' => $pass,
13 'remember' => true,
14 );
15
16 $login = wp_signon( $creds, false );
17
18 if ( ! is_wp_error( $login ) ) {
19 wp_redirect( admin_url() );
20 exit;
21 }
22}

Kolme sääntöä räätälöinnissä, jotka säästävät tuntikausia debuggausta.

Ensimmäinen: $user-parametrin arvo ei saa olla sama kuin WordPressin varatut avaimet. Neljä avainta on varattu: loggedout uloskirjautumiseen, action salasanan nollaukseen, redirect_to uudelleenohjauksiin kirjautumisen jälkeen ja wp_lang kielen vaihtamiseen. Jos käytät mitä tahansa näistä sanoista, automaattinen kirjautuminen ei joko toimi tai rikkoo ytimen vakiotoiminnan.

Toinen: salasana tallennetaan selkokielisenä lisäosan koodiin, joten älä koskaan käytä tätä pätkää ylläpitäjän tai päätoimittajan tunnuksille tuotantosivustolla. Demo-käyttäjä Tilaaja-roolilla tai korkeintaan Päätoimittajana on hyväksyttävä. Ylläpitäjä automaattisella linkkikirjautumisella on aukko, jonka hyökkääjä löytää sekunnissa.

Kolmas: jos sivusto toimii HTTPS:llä, korvaa false arvolla true wp_signon()-funktion toisessa argumentissa. Tämä ottaa käyttöön suojatun evästeen ja estää auth-tunnisteen kaappauksen verkkoliikenteestä.

Kirjautumisosoite näyttää tältä: https://your-site.com/wp-login.php?autologin=dummy. Sitä seuratessaan käyttäjä päätyy välittömästi hallintapaneeliin. Ei välinäyttöjä, ei tunnusten kopioi-liitä -toimintoa.

Monitunnus: yksi linkki, eri tunnukset

Entä jos demosivusto esittelee tuotteen eri rooleista? Ylläpitäjä näkee asetuspaneelin, päätoimittaja julkaisukäyttöliittymän, tilaaja henkilökohtaisen tilinsä. Tätä skenaariota varten laajennamme pätkää tukemaan useita tunnuksia:

1<?php
2/*
3Plugin Name: Auto Login
4Plugin URI: https://techblog.sdstudio.top/
5Description: Automatic login for demo accounts. Configure accounts in the array below.
6Version: 1.0.0
7Author: Harri Bell-Thomas
8*/
9
10$autologin_param = 'autologin';
11
12$autologin_accounts = array(
13 array(
14 'user' => 'demo',
15 'pass' => 'demo',
16 'location' => 'wp-admin',
17 ),
18 array(
19 'user' => 'editor_demo',
20 'pass' => 'demo',
21 'location' => 'wp-admin/post-new.php',
22 ),
23);
24
25function autologin() {
26 global $autologin_param, $autologin_accounts;
27
28 foreach ( $autologin_accounts as $account ) {
29 if ( $_GET[ $autologin_param ] === $account['user'] ) {
30 $creds = array(
31 'user_login' => $account['user'],
32 'user_password' => $account['pass'],
33 'remember' => true,
34 );
35
36 $user = wp_signon( $creds, false );
37
38 if ( ! is_wp_error( $user ) ) {
39 wp_redirect( admin_url( $account['location'] ) );
40 exit;
41 }
42 }
43 }
44}
45add_action( 'after_setup_theme', 'autologin' );

Mekaniikka on sama, mutta $autologin_accounts-taulukko tallentaa kaikkien demokäyttäjien kirjautumistiedot, ja foreach käy ne läpi etsien osumaa URL-parametrin arvon perusteella. Uuden tunnuksen lisääminen tarkoittaa taulukkolohkon kopioimista uusilla user-, pass- ja location-arvoilla.

location-parametri hyväksyy minkä tahansa suhteellisen polun /wp-admin/-hakemiston sisällä: esimerkiksi options-general.php asetussivulle, edit.php artikkelilistalle tai post-new.php uuden artikkelin luomiseen. Voit määrittää myös täyden URL-osoitteen ohjataksesi julkiselle puolelle, mutta silloin korvaa admin_url( $account['location'] ) koodissa arvolla $account['location'].

Sisäänmenopiste on sama: https://your-site.com/wp-login.php?autologin=editor_demo, ja käyttäjä laskeutuu artikkelinluontisivulle eikä hallintapaneelin juureen. Demosivuston omistajalle tämä tarkoittaa täyttä hallintaa ensivaikutelmasta: jokainen käyttäjätyyppi näkee täsmälleen sen osan tuotteesta, joka on relevantti hänen kiinnostuksensa kannalta.

⁉️🤔 Usein kysytyt kysymykset

Onko turvallista tallentaa salasanoja lisäosan koodiin?

Ei, se ei ole turvallista. Pätkä on suunniteltu demosivustoille, joissa tunnukset ovat tarkoituksella julkisia eikä niillä ole todellisia oikeuksia. Tuotantosivustolla, jossa on oikeita käyttäjiä, tämä lähestymistapa ei ole hyväksyttävä: selkokielinen salasana voi vuotaa missä tahansa kooditarkastuksessa. Tuotantoskenaarioihin harkitse kertakäyttöistä token-mekanismia tai SSO:ta REST API:n kautta nonce-varmennuksella.

Miksi ei wp_login-toimintoa, vaan suoraan wp_signon?

wp_login-koukku laukeaa onnistuneen kirjautumisen jälkeen, se ei suorita itse valtuutusta. wp_signon() on funktio, joka todentaa käyttäjän: se tarkistaa salasanan wp_authenticate()-funktiolla, asettaa evästeen ja laukaisee wp_login-koukun seurauksena. Jos sinun tarvitsee valtuuttaa käyttäjä ohjelmallisesti, wp_signon on työkalusi.

Voinko lisätä pätkän functions.php-tiedostoon erillisen lisäosan sijaan?

Kyllä, koodi toimii myös teeman functions.php-tiedostossa. Mutta lisäosa on kätevämpi: automaattinen kirjautuminen ei ole sidoksissa teemaan eikä hajoa teemaa vaihdettaessa. Lisäksi lisäosan voi deaktivoida yhdellä klikkauksella muokkaamatta tiedostoja palvelimella.

Mitä tehdä, jos käyttäjä ei ole kirjautuneena is_user_logged_in-tarkistuksen mukaan kirjautumisen jälkeen?

Tämä on tunnettu wp_signon()-funktion erikoisuus, kun sitä kutsutaan ennen init-koukkua: eväste on asetettu, mutta globaalia $current_user-muuttujaa ei ole vielä päivitetty. Ratkaisu on kutsua wp_set_current_user( $user->ID ) pakotetusti heti onnistuneen wp_signon()-kutsun jälkeen. Meidän pätkässämme tämä ei ole kriittistä, koska välitön uudelleenohjaus seuraa, mutta skenaarioissa ilman uudelleenohjausta rivi on pakollinen.

Toimiiko pätkä multisite-ympäristössä?

Kyllä, mutta yhdellä varauksella. wp_signon() valtuuttaa käyttäjän verkon nykyisellä sivustolla. Jos tunnus on olemassa vain yhdellä alisivustolla, automaattinen kirjautuminen ei toimi muilla. Koko verkon kattavaa ristiintodennusta varten käytä wp_signon()- ja wp_set_auth_cookie()-funktioiden yhdistelmää pakotetulla evästeasennuksella pääverkkotunnukselle.

Automaattisen kirjautumisen pätkä: mitä jää käteen

Viisitoista riviä PHP:tä poistaa pääkitkan demosivuston myyntisuppilosta: tunnuksen ja salasanan kopioinnin. Yksi linkki, ja vierailija on tuotteen sisällä, valitsemassasi roolissa ja osiossa.

Perusversio kattaa "yksi demokäyttäjä" -skenaarion, laajennettu versio minkä tahansa määrän rooleja eri uudelleenohjauspisteillä. Kumpikaan ei riipu teemasta, eivät vaadi kolmannen osapuolen lisäosia ja aktivoituvat minuutissa.

Tärkein turvallisuussääntö on, ettei oikeuksia koroteta. Demokäyttäjä Tilaaja-roolilla tai korkeintaan Päätoimittajana on hyväksyttävä. Ylläpitäjä automaattisella linkkikirjautumisella on aukko, jonka hyökkääjä löytää sekunnissa.

Jos demokäyttö on sinulle myyntikanava, automaattinen kirjautuminen lakkaa olemasta "kiva lisä" ja siitä tulee pakollinen konversioelementti. Yksi linkki tunnuksen ja salasanan sijaan on ero "kokeilen myöhemmin" ja "kokeilen nyt" välillä.