PHP JWT CI 框架


composer.json

     "require": {
         ...

        "nesbot/carbon": "^1.25",
        "firebase/php-jwt": "^5.0"
    },

/***  CI框架 helper自建文件 **************************/

/**
 * 校验jwt是否有效
 * @param string $jwt
 * @return array|bool 有效则返回 jwt 数组,无效返回 false
 */
function jwt_verify($jwt)
{
    $decoded = null;
    try {
        // config_item('encryption_key')  CI框架config配置的随机字符串
        $decoded = \Firebase\JWT\JWT::decode($jwt, config_item('encryption_key'), array('HS256'));
    } catch (\Firebase\JWT\ExpiredException $e) {
        // 过期
        return false;
    } catch (\Exception $e) {
        return false;
    }
    /*
     * NOTE: This will now be an object instead of an associative array. To get
     * an associative array, you will need to cast it as such:
     */
    return (array) $decoded;
}
/**
 * 学习文档
 * https://jwt.io/
 * https://github.com/firebase/php-jwts
 *
 * 生成jwt字符串
 * @param array $payload 要在jwt中携带的信息
 * @param int $exp 时间戳:过期时间;payload 和 exp 均不设置则永不过期
 * @return string 生成的jwt字符串
 */
function jwt_encode($payload = [], $exp = 0)
{
    /* jwt标准中注册的声明
    array(
        "iss" => "http://example.org", // jwt签发者
        "sub" => "", // jwt面向的用户
        "aud" => "http://example.com", // jwt接收者
        "iat" => 1356999524, // jwt签发时间
        "nbf" => 1357000000, // jwt生效时间,在该时间前一直无效
        "exp" => 1520000000, // jwt的过期时间,这个过期时间必须要大于签发时间
        "jti" => '', // jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。
    );
    */
    $now = time();
    $_payload = array(
        // "iat" => 1520000000,
        // "nbf" => 1520000000,
        "exp" => $now + 3600,
    );
    $payload = array_merge($_payload, $payload);
    if ($exp > 0) {
        $payload['exp'] = $exp;
    }

    // 签发服务器和验证服务器有时间差时设置,不要设置太大
    // JWT::$leeway = 60;
      // config_item('encryption_key') CI框架config配置的随机字符串
    $jwt = \Firebase\JWT\JWT::encode($payload, config_item('encryption_key'));

    return $jwt;
}
function check_login_status()
{
    $CI = &get_instance();
    // config_item('jwt_user_info_cookie_name')  CI框架config配置的随机字符串
    $jwt_user_info = $CI->input->cookie(config_item('jwt_user_info_cookie_name'));

    $jwt =  jwt_verify($jwt_user_info);
    if(isset($jwt["user"])){
        //兼容新SSO系统jwt
        $user = (array)$jwt["user"];
        $user_info = [
            "username"=>$user["XXX"],
            "user_id"=>$user["id"],
            "ip"=>$user["ip"],
        ];
        return $user_info;
    }
    return $jwt;
}
/***********************************************************
 * 退出
 ***********************************************************/
public function logout()
{
    $cookie_name = config_item('jwt_user_info_cookie_name'); // 键名
    delete_cookie($cookie_name);
    getJsonInstance()->code(0)->msg('退出成功')->out();
}
/*************************************************************
 * 写入登录cookie
 * @param $cookie_data
 * @param bool $keep_30 记住密码30天
 * @return string
 **************************************************************/
private function set_login_cookie($cookie_data, $keep_30 = false)
{
    // 保存 user_info 的 cookie 键名
    $cookie_name = config_item('jwt_user_info_cookie_name');
    $now = time();
    if ($keep_30) {
        // 30天免密登录
        $exp = 3600 * 24 * 30;
        $token = jwt_encode($cookie_data, $now + $exp);
        // 设置 cookie ,有效期同token有效期
        // CI框架的set_cookie方法传的exp是cookie有效时长,不是失效时间
        set_cookie($cookie_name, $token, $exp);
    } else {
        // 普通登录
        $exp = 3600 * 24;
        $token = jwt_encode($cookie_data, $now + $exp);
        // 设置 cookie ,有效期为会话有效期
        set_cookie($cookie_name, $token, 0);
    }
    return $token;
}
php
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!