Creare API pentru autentificare unică cu un site terț
Site-ul meu trebuie să se integreze cu un software terț, care va funcționa pe propriul subdomeniu, găzduit de compania care dezvoltă software-ul. Trebuie să ofer dezvoltatorilor terți un endpoint pe care îl pot folosi pentru a face apeluri API (către site-ul meu WordPress) pentru a permite utilizatorilor mei să acceseze subdomeniul.
Celălalt site trebuie să autentifice utilizatorii de pe site-ul meu printr-un fel de API.
Nu sunt sigur de unde să încep, dar am senzația că această problemă a fost rezolvată deja de oameni mai deștepți decât mine. Mulțumesc anticipat!

Probleme de Cross-site Scripting
Nu poți transfera cookie-urile de autentificare WP între domenii. De asemenea, nu dorești să stochezi parole în text simplu pentru a te conecta programatic la o altă instalare WP. Prin urmare, va trebui să lași utilizatorii să se autentifice în WordPress, iar apoi să accesezi starea lor de autentificare printr-un punct final API de pe site-ul terț. Acest lucru permite WordPress să gestioneze toată autentificarea. Este destul de sigur, deoarece un utilizator va trebui să se autentifice fizic pe partea WP pentru ca punctul final API să furnizeze datele către terț.
Crearea unui Punct Final API
Consultă acest articol pe care tocmai l-am scris aici: http://coderrr.com/create-an-api-endpoint-in-wordpress/
De asemenea, poți vedea demonstrația de cod aici: https://gist.github.com/2982319
Va trebui să stabilești logica pentru nevoile proprii ale aplicației tale, dar acest lucru îți va permite să creezi un punct final de unde poți furniza orice dorești din partea WordPress.
Deoarece folosești WordPress ca site de autentificare, poți utiliza o verificare precum is_user_logged_in(). Dacă utilizatorul este autentificat, returnează un obiect de utilizator către terța parte cu orice informații au nevoie.
Autentificare din Partea Terței Părți
Din partea terței părți, aceștia pot să ofere un link către pagina ta de autentificare pentru o experiență fără întreruperi, folosind variabila de interogare redirect_to. După autentificare, aceștia vor fi redirecționați înapoi pe site-ul terței părți.
http://sub.yourdomain.com/wp-login.php?redirect_to=http%3A%2F%2Fwww.third-party-domain.com
Autentificări de la Distanță
Dacă trebuie să autentifici utilizatori în WordPress de pe un site terț, poți folosi câteva funcții simple WP enumerate pe acest site: http://kuttler.eu/code/log-in-a-wordpress-user-programmatically/
Cu siguranță va trebui să folosești un secret partajat și să creezi hash-uri bazate pe timp din acel secret pentru a menține lucrurile sigure. Practic, iată cum ar arăta:
Terța parte trimite o cerere cu un marcaj de timp și un token generat de un secret partajat:
$shared_secret = 'foobar'; //nu trimite acest lucru la punctul final API
$timestamp = time();
$token = md5($shared_secret.$time_stamp);
Instalarea WordPress primește cererea:
$shared_secret = 'foobar';
$timestamp = esc_attr($_GET['timestamp']);
if((time() - $timestamp) > 30) # Pragul este de 30 de secunde
//fă ceva aici - TOKEN expirat!
$token = md5($share_secret.$timestamp);
$token_to_check = esc_attr($_GET);
if($token == $token_to_check)
//autentificat!

Sunt destul de sigur că bucata de software terță nu are nicio legătură cu WP, deci în esență este single sign on, dar cu WP care acționează ca furnizor de autentificare.

@Brian: Sunt interesat de ideea de a trece la o instalare multi-site, dar nu înțeleg pe deplin punctul tău legat de cookie-uri. Tot ce trebuie să se întâmple este ca software-ul terță să verifice dacă utilizatorul său este de fapt unul dintre utilizatorii mei. Software-ul este în rest autonom și își poate furniza propriile cookie-uri sau orice altceva.

@Emerson Acum am înțeles. Îmi cer scuze pentru confuzie. Ai putea folosi ideea de endpoint pe care am creat-o și să utilizezi token partajat în user meta pentru autentificare. Returnează un răspuns JSON către terța parte dacă utilizatorul există.

Mulțumesc Brian, m-am uitat mai atent și cred că încep să înțeleg soluția ta. Ai putea să-mi arăți un pic de cod ca exemplu cum ar funcționa pluginul tău pentru aplicația mea? M-am uitat la codul sursă și nu înțeleg 100%.

Ca să fiu mai specific, sunt curios cum aș putea adapta pluginul tău pentru scopul meu. Trebuie să schimb asta: protected $api = 'http://pugme.herokuapp.com/bomb?count=';
în protected $api = http://mydomain.com/api/...
deoarece scriptul meu va verifica informații în baza mea de date, nu într-un API terță parte... ?

@Emerson Nu ai nevoie să folosești variabila api, deoarece vei interoga direct baza de date WordPress în loc să ai un endpoint pentru un API terță parte. Poți să elimini asta. Magia se întâmplă în add_rewrite_rule(); Dacă ai alte întrebări, contactează-mă pe site-ul meu.

@Brian mulțumesc mult, aceasta este o soluție excelentă! Am o întrebare însă. Cererea către endpoint de la aplicația terță parte trebuie făcută pe partea de client? Am încercat local: când fac cererea direct în browser primesc un răspuns corect "este autentificat" de la endpoint, dar când o fac dintr-o pagină PHP nu primesc. Cred că trebuie să cer statusul de autentificare de la browser pentru că partea de server nu este conștientă de status.

Nu am reușit să fac această abordare să funcționeze, după câteva zile de lucru.

Soluție foarte bună. Ar putea exista o problemă dacă aplicațiile sunt instalate pe servere diferite și din anumite motive ora fiecărei mașini este diferită. Aș sugera să folosiți counter
în loc de time()
și să îl transmiteți împreună cu cererea. Ambele părți păstrează ultimul counter transmis, iar când API-ul primește o cerere cu un counter nou, verifică dacă noul counter este mai mare decât ultimul. În acest fel, o întârziere nu poate provoca probleme.
