2014-02-13 11 views
6

Ich erstelle also eine REST-API für eine Webanwendung, die ich entwickle, und weiß, dass die grundlegenden Authentifizierungsmethoden entweder das Senden der Anmeldeinformationen bei jeder Anfrage oder das Senden eines Tokens sind.CakePHP-Authentifizierung in der REST-API

Da ich noch nie Token verwendet habe, denke ich, dass ich die Anmeldeinformationen für jede Anfrage senden kann. Der Punkt ist, ich kann keine Beispiele finden, wie man das im Controller behandelt. Wäre es so etwas?

public function api_index() { 
    if(!$this->Auth->login()) return; 

    $this->set(array(
     'models' => $this->Model->find('all'), 
     '_serialize' => array('models') 
    )); 
} 

Ich glaube nicht, das wirklich die Art und Weise AuthComponent::login() Werke ist, kann ich bitte einige Richtungen hier?

Antwort

1

AuthComponent :: login() erstellt eine Sitzungsvariable, die die Benutzerdaten speichert, also sagen Sie, dass Sie Daten hatten, die etwas wie waren.

$data = array('User' => array('id' => 1, 'username' => 'johndoe')); 

Dann würden Sie

$this->Auth->login($data); 

verwenden und Zugriff auf die Daten mit

$this->Auth->user('User'); 

der Benutzer-ID

$this->Auth->user('User.id'); 

In Ihrem AppControllers zu bekommen before $this->Auth->deny(); setzen, die wird alle Aktionen für jemanden verweigern, der nicht eingeloggt ist. Dann in jedem Controller vor dem Filter wollen Sie $this->Auth->allow(array('view')); 'view' ist der Name einer Aktion, die Sie öffentlich sein möchten.

http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html

+0

Vielen Dank für Ihre Antwort. Ich habe mich gefragt, wie ich mich bei jeder Aktion authentifizieren kann, da eine mobile App, die die API verwendet, keine Sitzung verwalten kann –

5

Okay, zunächst eine Klärung darüber, wie Auth Komponente :: login funktioniert. In Cake 2.x führt diese Methode keine Authentifizierung durch, sondern erstellt das Auth.User-Array in Ihrer Sitzung. Sie müssen die eigentliche Authentifizierung selbst implementieren (das Benutzermodell ist hierfür ein natürlicher Ort). Eine einfache Authentifizierungsmethode könnte folgendermaßen aussehen:

App::uses('AuthComponent', 'Controller/Component'); 
public function authenticate($data) { 
    $user = $this->find('first', array(
     'conditions' => array('User.login' => $data['login']), 
    )); 
    if($user['User']['password'] !== AuthComponent::password($data['password']) { 
     return false; 
    } 

    unset($user['User']['password']); // don't forget this part 
    return $user; 
    // the reason I return the user is so I can pass it to Authcomponent::login if desired 
} 

Jetzt können Sie diese von jedem Controller aus verwenden, solange das Benutzermodell geladen ist. Möglicherweise wissen Sie, dass Sie es laden können, indem Sie Controller::loadModel('User') aufrufen.

Wenn Sie jede Anfrage authentifizieren wollen, dann sollten Sie dann in der before Methode der AppController setzen:

public function beforeFilter() { 
    $this->loadModel('User'); 
    if(!$this->User->authenticate($this->request->data)) { 
     throw new UnauthorizedException(__('You don\'t belong here.')); 
    } 
} 

Alle der oben genannten geht davon aus, dass Sie POST-Werte für Login und Passwort passieren jedes Mal. Ich denke Token-Authentifizierung ist definitiv der bessere Weg zu gehen, aber für die Inbetriebnahme sollte dies funktionieren. Einige Nachteile sind das Senden von Passwort in Klartext (es sei denn, Sie benötigen SSL), jede Anfrage und die wahrscheinlich hohe CPU-Nutzung des Hash-Algorithmus jedes Mal. Trotzdem hoffe ich, dass Sie dadurch eine bessere Vorstellung davon bekommen, wie Sie die Authentifizierung mit CakePHP durchführen können.

Lassen Sie mich wissen, wenn etwas geklärt werden muss.

Update: Seit dieser Veröffentlichung habe ich herausgefunden, dass Sie AuthComponent :: Login ohne Parameter verwenden können, aber ich bin kein Fan davon. Von der CakePHP Dokumentation:

In 2.x $this->Auth->login($this->request->data) will log the user in with 
whatever data is posted, whereas in 1.3 $this->Auth->login($this->data) 
would try to identify the user first and only log in when successful. 
1

CakePHP 2.X, Nach vielen Nachforschungen darüber im Internet fand ich keine befriedigende Antwort. Also habe ich einen Weg gefunden, dies selbst zu tun. Vielleicht wird diese Antwort einigen Leuten in Zukunft helfen. Diese Antwort gilt nur für REST-APIs in Cake php.

Add in Ihrer Logik Wirkung von REST-API folgende Zeile vor $this->Auth->login().

$this->request->data['User'] = $this->request->data ; 
if($this->Auth->login()){ 
    echo "Hurray You are logged In from REST API."; 
} 
else 
{ 
    throw new UnauthorizedException(__('You don\'t belong here.')); 
} 

Desciption für die Prüfung: Wie @threeve sagte in einer der Antworten, die $this->Auth->login() keine Authentifizierung tun selbst. sondern erstellt das Auth.User-Array in Ihrer Sitzung. Für die Authentifizierung benötigen wir unsere $ this-> request-> Daten innerhalb des User Arrays, da User das Model ist, welches die Credentials in Database überprüft. Daher müssen wir die Daten an Auth weitergeben, wie es erforderlich ist, wenn REST-APIs nicht verwendet werden. Der Rest der Dinge wird von Cake und Auth selbst erledigt.

Alle Verbesserungen oder Vorschläge zu dieser Antwort sind sehr willkommen.

Verwandte Themen