web-dev-qa-db-fra.com

authentification basée sur des jetons dans la bibliothèque du serveur de repos codeigniter

J'essaie de construire une API reposante dans codeigniter en utilisant le serveur de repos de Phil Sturgeon

Le problème est que je ne peux pas comprendre comment faire une authentification basée sur des jetons. Je construis cette API pour l'application mobile et c'est via HTTPS. Au début, l'utilisateur s'authentifiera en se connectant, puis il pourra utiliser les fonctionnalités de l'application. Je veux implémenter de la manière expliquée ici: Fonctionnement de l'authentification basée sur les jetons

Des questions:

Si j'envoie un jeton au serveur à la demande, où dois-je vérifier la validité?
La bibliothèque du serveur de repos prend-elle en charge l'authentification basée sur les jetons?
Si c'est le cas, quelles configurations dois-je faire? ou je dois implémenter mes méthodes d'authentification?

ou existe-t-il un moyen meilleur/plus simple d'authentification plutôt que basé sur des jetons?

10

Il ne prend pas en charge l'authentification par jeton. Voici les modifications que j'ai apportées pour l'ajouter. REST_Controller.php recherche pour "switch ($ rest_auth) {" add ajoutez ce cas:

        case 'token':
            $this->_check_token();
            break;

Ajoutez ensuite cette fonction:

/** Check to see if the user is logged in with a token
 * @access protected
 */
protected function _check_token () {
    if (!empty($this->_args[$this->config->item('rest_token_name')])
            && $row = $this->rest->db->where('token', $this->_args[$this->config->item('rest_token_name')])->get($this->config->item('rest_tokens_table'))->row()) {
        $this->api_token = $row;
    } else {
        $this->response([
                $this->config->item('rest_status_field_name') => FALSE,
                $this->config->item('rest_message_field_name') => $this->lang->line('text_rest_unauthorized')
                ], self::HTTP_UNAUTHORIZED);
    }
}   

config/rest.php

    // *** Tokens ***
/* Default table schema:
 * CREATE TABLE `api_tokens` (
    `api_token_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `token` VARCHAR(50) NOT NULL,
    `created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`api_token_id`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
 */
$config['rest_token_name'] = 'X-Auth-Token';
$config['rest_tokens_table'] = 'api_tokens';

Contrôleur pour obtenir le jeton:

J'ai construit un contrôleur de repos pour obtenir le jeton.

require APPPATH . 'libraries/REST_Controller.php';
class Token extends REST_Controller {
    /** 
     * @response array
     */
    public function index_get() {
        $data = $this->Api_model->create_token($this->api_customer_id);

        // ***** Response ******
        $http_code = $data['http_code'];
        unset($data['http_code']);
        $this->response($data, $http_code);
    }
}

Fonction dans le modèle de jeton:

/** Creates a new token
* @param type $in
* @return type
*/
function create_token ($customer_id) {
    $this->load->database();

    // ***** Generate Token *****
    $char = "bcdfghjkmnpqrstvzBCDFGHJKLMNPQRSTVWXZaeiouyAEIOUY!@#%";
    $token = '';
    for ($i = 0; $i < 47; $i++) $token .= $char[(Rand() % strlen($char))];

    // ***** Insert into Database *****
    $sql = "INSERT INTO api_tokens SET `token` = ?, customer_id = ?;";
    $this->db->query($sql, [$token, $customer_id];

    return array('http_code' => 200, 'token' => $token);
}