Thinkphp6入门以及集成jwt

官方文档:https://www.kancloud.cn/manual/thinkphp6_0/1037479

composer文档:https://www.kancloud.cn/thinkphp/composer

一.TP6下载安装

安装要求:

php>7.1.0
6.0版本开始,必须通过Composer方式安装和更新,所以你无法通过Git下载安装。

安装composer

1.下载 composer.exe
2.安装注意选择系统环境变量以及php

通过composer获取tp6

然后在你选择的目录下打开cmd
通过

composer create-project topthink/think tp

下载,然后你会发现
Thinkphp6入门以及集成jwt_第1张图片
表示下载成功!
然后再目录下可以看到tp这个文件夹。自此tp6下载完成。

运行tp6

我使用的使phpstudy_pro。用phpstudy创建站点,目录选着到tp5/public中,具体如图所示
Thinkphp6入门以及集成jwt_第2张图片
选择完成后,我们就可以直接使用啦。不要忘记打开apache OR nginx啊,然后我们可以直接打开网址
localhost:1470
观察到如下页面:
Thinkphp6入门以及集成jwt_第3张图片
好,至此你的tp6已经安装完成。

目录结构分析

www  WEB部署目录(或者子目录)
├─app           应用目录
│  ├─controller      控制器目录
│  ├─model           模型目录
│  ├─ ...            更多类库目录
│  │
│  ├─common.php         公共函数文件
│  └─event.php          事件定义文件
│
├─config                配置目录
│  ├─app.php            应用配置
│  ├─cache.php          缓存配置
│  ├─console.php        控制台配置
│  ├─cookie.php         Cookie配置
│  ├─database.php       数据库配置
│  ├─filesystem.php     文件磁盘配置
│  ├─lang.php           多语言配置
│  ├─log.php            日志配置
│  ├─middleware.php     中间件配置
│  ├─route.php          URL和路由配置
│  ├─session.php        Session配置
│  ├─trace.php          Trace配置
│  └─view.php           视图配置
│
├─view            视图目录
├─route                 路由定义目录
│  ├─route.php          路由定义文件
│  └─ ...   
│
├─public                WEB目录(对外访问目录)
│  ├─index.php          入口文件
│  ├─router.php         快速测试文件
│  └─.htaccess          用于apache的重写
│
├─extend                扩展类库目录
├─runtime               应用的运行时目录(可写,可定制)
├─vendor                Composer类库目录
├─.example.env          环境变量示例文件
├─composer.json         composer 定义文件
├─LICENSE.txt           授权说明文件
├─README.md             README 文件
├─think                 命令行入口文件

直接操作数据库

首先数据库我们新建一个命名为"tp6test"
新建表"zk_user"
在这里插入图片描述
三个字段
然后我们去tp/app下面新建一个文件夹命名为model
在model下面新建一个php,使其继承Model
Thinkphp6入门以及集成jwt_第4张图片
然后再controller下面的index中新建一个函数名字随意,放入以下代码

public function asd()
    {
        $data = Db::name('user')->select();
        return json_encode($data);
    }

然后我们打开debug模式
在tp根目录下.example.env环境变量示例文件,改成.env文件后就可以了,然后修改一下数据库连接
在database.php中添加表前缀
在这里插入图片描述
然后我们访问http://localhost:1470/index.php/index/asd就可以看到我们的数据啦
Thinkphp6入门以及集成jwt_第5张图片

然后我们集成一下JWT

1.客户端使用用户名和密码请求登录
2.服务端收到请求,验证用户名和密码
3.验证成功后,服务端会签发一个token,再把这个token返回给客户端
4.客户端收到token后可以把它存储起来,比如放到cookie中
5.客户端每次向服务端请求资源时需要携带服务端签发的token,可以在cookie或者header中携带
6.服务端收到请求,然后去验证客户端请求里面带着的token,如果验证成功,就向客户端返回请求数据

安装jwt扩展

composer require firebase/php-jwt

安装成功项目文件夹为 firebase

Thinkphp6入门以及集成jwt_第6张图片

调用 JWT里面的 encode 和 decode方法进行生成token和验证token

在common.php下面放入以下代码

<?php
// 应用公共文件
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
/**
 * 生成验签
 * @param $uid 用户id
 * @return mixed
 */
function signToken($uid){
    $key='abcdefg';         //自定义的一个随机字串用户于加密中常用的 盐  salt
    $token = array(
        "iss" => $key,
        //"aud" => $id,//接收人,也就是发给谁
        "iat" => time(),//签发时间,当前时间
        "nbf" => time()+3,//生效时间,在生成时间后一点点
        'exp' => time()+10800,//过期时间,三个小时
        'data'=> ['uid'=>$uid]//自定义信息
    );

    //  print_r($token);
    $jwt = JWT::encode($token, $key, "HS256");  //生成了 token
    return $jwt;
}

/**
 * 验证token
 * @param $token
 * @return array|int[]
 */
function checkToken($token){
    $result["token"] = $token;
    $key='abcdefg';     //自定义的一个随机字串用户于加密中常用的 盐  salt
    try {
        //延长有效期1分钟
        JWT::$leeway = 60;
        //对token解码,得到的一个对象,所以直接转成数组
        $data = (array)JWT::decode($token,new Key($key, 'HS256'));
        //获取token里面的相关信息并赋值给数据集
        $result['data'] = $data['data'];
        //定义Result变量的status字段
        $result['status'] = 10001;
        //验证通过后返回$result数据集
        return $result;
        //如果验证失败,catch以下错误
    }catch (SignatureInvalidException $exception){
        //定义result数据集状态码status和data的默认值
        $result['status'] = 10002;
        $result['data']   = '验证失败!请重新登录';
        return $result;
    }catch (BeforeValidException $exception){
        //定义result数据集状态码status和data的默认值
        $result['status'] = 10003;
        $result['data']   = 'token未生效,请稍后!';
        return $result;
    }catch (ExpiredException $exception){
        //定义result数据集状态码status和data的默认值
        $result['status'] = 10004;
        $result['data']   = '登录过期,请重新登录!';
        return $result;
    }catch (Exception $exception){
        //定义result数据集状态码status和data的默认值
        $result['status'] = 10005;
        $result['data']   = '未知错误,请重新登录!';
        return $result;
    }

}



完成登录接口返回token

<?php
namespace app\controller;

use app\BaseController;

use think\facade\Db;

class User extends BaseController
{
    public function login()
    {
        if ($this->request->isPost()){
            $username = $this->request->param('username','','trim');
            $password = $this->request->param('password','','trim');

            //查询数据库
            $user = Db::name('user')->where('username',$username)->select();
            $user = $user[0]["id"];
            if (!$user){
                return json(['status' => 'fail','msg' => '用户名不存在?']);
            }
            $getToken = signToken($user);
            return json(['status' => $user,'msg' => '登陆成功','token' => $getToken]);
        }
    }

}

利用tp6中间件去拦截检查是否携带token以及token是否正确

<?php

namespace app\middleware;

class Auth
{
    public function handle($request, \Closure $next)
    {
        //获取前端header请求信息并把token信息转在字符串
        $token = (string)$request->header('token');
        if (empty($token)) {
            return json(['status' => 'fail','msg' => $token]);
        }
        //调用JWTAuth里面的checkAdminToken()方法对token解码
        $result = checkToken($token);
        //result得到包含有status/data字段的数据集
//        return $next($request);

        if ($result['status'] !== 10001) {
            //如果status 不等于10001,验证失败,返回错误提示
            return json($result);
        } else {
            //否则验证通过,把result里面data数据传给$request
            //经过测试,数据并不能传到¥request的header里面,也不知道怎么调用,很是烦躁
//            $request->loginMsg = $result['data'];
            //执行下一步代码
            return $next($request);
        }
    }
}

你可能感兴趣的:(php)