Creare API pentru autentificare unică cu un site terț

18 iul. 2012, 20:42:14
Vizualizări: 19.6K
Voturi: 13

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!

2
Comentarii

Ce tip de apeluri API vor fi necesare? Ce încerci să faci? Ai verificat suportul XML-RPC al WordPress (http://codex.wordpress.org/XML-RPC_Support) ?

anu anu
19 iul. 2012 03:17:50

Celălalt site trebuie să verifice/autentifice utilizatorii de pe site-ul meu WordPress.

emersonthis emersonthis
19 iul. 2012 16:31:33
Toate răspunsurile la întrebare 1
11
16

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!
18 iul. 2012 21:43:07
Comentarii

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.

anu anu
19 iul. 2012 17:03:02

@anu: Corect.

emersonthis emersonthis
20 iul. 2012 17:52:18

@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.

emersonthis emersonthis
20 iul. 2012 17:56:55

@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ă.

Brian Fegter Brian Fegter
20 iul. 2012 20:18:20

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%.

emersonthis emersonthis
21 iul. 2012 17:26:00

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... ?

emersonthis emersonthis
23 iul. 2012 20:15:21

@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 Fegter Brian Fegter
23 iul. 2012 20:19:38

Perfect. O voi face.

emersonthis emersonthis
23 iul. 2012 20:25:19

@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.

And Finally And Finally
7 iul. 2014 18:49:47

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

And Finally And Finally
15 iul. 2014 18:42:09

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.

guyaloni guyaloni
29 dec. 2014 13:24:47
Arată celelalte 6 comentarii