【问题标题】:token based authentication in codeigniter rest server librarycodeigniter REST 服务器库中基于令牌的身份验证
【发布时间】:2017-09-10 10:18:05
【问题描述】:

我正在尝试使用 Phil Sturgeon 的 rest servercodeigniter 中构建 restful API

问题是我不知道如何进行基于令牌的身份验证。我正在为移动应用程序构建该 API,它是通过 HTTPS 实现的。首先,用户将通过登录进行身份验证,然后他将能够使用应用程序功能。 我想按照这里解释的方式实现:How token-based authentication works

问题:

如果我在请求中向服务器发送令牌,我应该在哪里检查有效性?
REST 服务器库是否支持基于令牌的身份验证?
如果可以,我需要做哪些配置?还是我需要实现我的身份验证方法?

或者有更好/更简单的身份验证方式而不是基于令牌的方式?

【问题讨论】:

    标签: php codeigniter-3 codeigniter-restserver


    【解决方案1】:

    不支持令牌认证。这是我为添加它所做的修改。 REST_Controller.php 搜索“switch ($rest_auth) {”添加这个案例:

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

    然后添加这个函数:

    /** 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);
        }
    }   
    

    配置/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';
    

    【讨论】:

    • 这个怎么用?我做这一切。如何获得令牌
    • 我刚刚添加了控制器和模型函数来获取令牌。还有一些工作要做,实际上我从第一个答案开始更改了对其余库的修改。
    • 令牌到期怎么办?
    • 它没有内置到库中。如果我有时间,我可能会创建一个开源项目来扩展库以添加到令牌和其他东西中。
    【解决方案2】:

    获取令牌的控制器:

    我构建了一个休息控制器来获取令牌。

    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);
        }
    }
    

    代币模型中的功能:

    /** 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);
    }   
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-16
      • 2017-11-27
      • 2013-03-07
      • 1970-01-01
      • 2013-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多