簡體   English   中英

REST API上的CakePHP身份驗證

[英]CakePHP Authentication on REST API

所以我正在為我正在開發的Web應用程序創建一個REST API,我知道身份驗證的基本方法是在每個請求上發送憑據或發送令牌。

由於我以前從未使用過令牌,我想我可以為每個請求發送憑據。 關鍵是我找不到任何關於如何在控制器中處理這個問題的例子。 它會是這樣的嗎?

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

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

我真的不認為這是AuthComponent::login()工作方式,我可以在這里得到一些指示嗎?

好的,首先澄清一下AuthComponent :: login的工作原理。 在Cake 2.x中,該方法不進行任何身份驗證,而是在會話中創建Auth.User數組。 您需要自己實現實際的身份驗證(用戶模型是一個自然的地方)。 基本身份驗證方法可能如下所示:

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
}

現在,只要加載了用戶模型,就可以從任何控制器使用它。 您可能知道可以通過調用Controller::loadModel('User')來加載它。

如果你想驗證每個請求,那么你應該放入AppController的beforeFilter方法:

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

以上所有假設您每次都會傳遞登錄名和密碼的POST值。 我認為令牌認證絕對是更好的方法,但是為了起床和運行這應該是有效的。 一些缺點包括以明文形式發送密碼(除非您需要ssl)每次請求以及散列算法可能的高CPU使用率。 不過,我希望這能讓您更好地了解如何使用cakephp進行身份驗證。

如果有需要澄清,請告訴我。

更新:自發布以來,我發現您實際上可以使用沒有參數的AuthComponent :: login,但我不是這樣做的粉絲。 從CakePHP文檔:

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.

AuthComponent :: login()創建一個存儲用戶數據的會話變量,所以說你有類似的數據。

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

然后你會用

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

並使用。訪問數據

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

獲取用戶ID

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

在你的AppControllers beforefilter中放入$this->Auth->deny(); 這將拒絕所有未登錄的人的操作。然后在每個控制器中過濾之前你想要$this->Auth->allow(array('view')); 'view'是您想要公開的動作的名稱。

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

Cakephp 2.X ,經過對互聯網的大量研究后,我沒有找到任何滿意的答案所以我找到了一種方法來做到這一點。 可能這個答案將來會幫助一些人。 這個答案僅適用於蛋糕php中的REST API。

在檢查$this->Auth->login().之前,在REST API的邏輯操作中添加以下行$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 :正如@threeve在其中一個答案中所說的那樣, $this->Auth->login()本身不進行任何身份驗證。 而是在會話中創建Auth.User數組。 對於身份驗證,我們要求$ this-> request-> data在User數組中,因為User是將檢查數據庫中的憑據的模型。 因此,當不使用REST API時,我們必須將數據傳遞給Auth。 其余的事情將由Cake和Auth本身處理。

對此答案的任何改進或建議都是最受歡迎的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM