客户管理系统开发定制thinphp6 tp6 api接口开发,token(jwt)登录验证

  1. # 1.安装tp6
  2. composer create-project topthink/think mv
  3. #2 创建User控制器
  4. php think make:controller User --api
  5. #3 创建User模型,客户管理系统开发定制对应数据库表 user
  6. php think make:model User


 

客户管理系统开发定制用创建数据库,并在.env客户管理系统开发定制文件中填写数据库信息;user表字段为:

 客户管理系统开发定制然后编辑控制器 user.index 方法:

客户管理系统开发定制浏览器打开:正常显示;

然后再次编辑user.index.方法,这时我们显示点别的,就显示数据库user模型的内容;

  1. #注意顶部引入User模型;as避免重名
  2. use app\model\User as UserModel;
  3. #重写index方法,select()选择数据库内所有行;
  4. public function index()
  5. {
  6. return UserModel::select();
  7. }

效果如下:

 

 和数据库是对应的,如果有错误,把config/app.php的 'show_error_msg'   => true打开,显示错误信息;example.env改成.env,然后配置数据库连接信息;


以下非常简单,有点tp基础的都可以弄;下面,继续;

请求是json格式的,如何让请求的内容为json;如果为api快速创建路由:

1.资源路由;

编辑:route/app.php,增加一条资源 路由;

Route::resource('user', 'User');

 然后可以用命令查看:

这样一来,直接编辑User控制器的方法就行了;资源路由己经默认创建了一些方法; 我们编辑这些方法让其返回json数据,核心代码就是:

return \think\Response::create($result, $type);

说白了,就是用tp的Response对象的create建立一个响应,类型为json,好,下面来封装这个方法,让他好看点;

在app\controller控制器目录下建立 Base.php,这个是虚基类,让其它控制器继承:

 修改User控制器:

  1. public function index()
  2. {
  3. $data = \app\model\User::field('id,username,email')->select();
  4. //查询所有数据
  5. return $this->create($data, $data->isEmpty() ? '数据不存在' : '数据请求成功');
  6. }

显示结果就是json数据了:

 下面,来个分页:也是编辑user.index控制器方法:

  1. public function index()
  2. {
  3. $data = \app\model\User::field('id,username,email')->paginate(5);
  4. return $this->create($data, $data->isEmpty() ? '数据不存在' : '数据请求成功');
  5. }

 第二页:注意url参数:

 完善User.read控制器方法,使其能访问/user/2 (访问id为2的用户信息)

  1. public function read($id)
  2. {
  3. //
  4. //判断$id 为整型
  5. if (!Validate::isInteger($id)) {
  6. return $this->create([], 'id 参数错误~', 400);
  7. }
  8. //获取数据
  9. $data = UserModel::field('id,username,email')->find($id);
  10. //查询数据
  11. if (empty($data)) {
  12. return $this->create([], '没有数据', 204);
  13. } else {
  14. return $this->create($data, '数据请求成功', 200);
  15. }
  16. }

 其它的save,delete,就不写了,自己完善,这时,请求api,以json返回就可以了;现在,我们来做token验证;

1.安装 jwt;

composer require firebase/php-jwt

创建一个token服务 ,会在app/service目录下生成Token.php,然后修改Token.php文件,这个文件基本上就是生成token字符串,校验的作用;自己手工创建也是一样的;

然后,我们创建一个中间件,用于检测token,如果没有token,就给客户端(前端)返回错误,提示没有登录 什么的。。。

JWT生成和效验common.php公共函数:

  1. <?php
  2. use \Firebase\JWT\JWT;
  3. use Firebase\JWT\Key;
  4. // 应用公共文件
  5. /**
  6. * 生成验签
  7. * @param $uid 用户id
  8. * @return mixed
  9. */
  10. function signToken($uid){
  11. $key='abcdefg'; //自定义的一个随机字串用户于加密中常用的 盐 salt
  12. $token=array(
  13. "iss"=>$key, //签发者 可以为空
  14. "aud"=>'', //面象的用户,可以为空
  15. "iat"=>time(), //签发时间
  16. "nbf"=>time()+2, //在什么时候jwt开始生效
  17. "exp"=> time()+7200, //token 过期时间
  18. "data"=>[ //记录的uid的信息
  19. 'uid'=>$uid,
  20. ]
  21. );
  22. // print_r($token);
  23. $jwt = JWT::encode($token, $key, "HS256"); //生成了 token
  24. return $jwt;
  25. }
  26. /**
  27. * 验证token
  28. * @param $token
  29. * @return array|int[]
  30. */
  31. function checkToken($token){
  32. $key='abcdefg'; //自定义的一个随机字串用户于加密中常用的 盐 salt
  33. $res['status'] = false;
  34. try {
  35. JWT::$leeway = 60;//当前时间减去60,把时间留点余地
  36. $decoded = JWT::decode($token, new Key($key, 'HS256')); //HS256方式,这里要和签发的时候对应
  37. $arr = (array)$decoded;
  38. $res['status'] = 200;
  39. $res['data'] =(array)$arr['data'];
  40. return $res;
  41. } catch(\Firebase\JWT\SignatureInvalidException $e) { //签名不正确
  42. $res['info'] = "签名不正确";
  43. return $res;
  44. }catch(\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用
  45. $res['info'] = "token失效";
  46. return $res;
  47. }catch(\Firebase\JWT\ExpiredException $e) { // token过期
  48. $res['info'] = "token失效";
  49. return $res;
  50. }catch(Exception $e) { //其他错误
  51. $res['info'] = "未知错误";
  52. return $res;
  53. }
  54. }
php think make:middleware Auth

这条命令会在app\middleware下创建Auth.php中间件,中间件有全局,控制器,路由三种,这里我们用路由中间件;

我们修改这个中间件(Auth.php):

  1. public function handle($request, \Closure $next)
  2. {
  3. //
  4. //第一步先取token
  5. $token = $request->header('token');
  6. //jwt进行校验token
  7. $res = (new TokenServer())->chekToken($token);
  8. if ($res['code'] != 1 ){
  9. return ['error_code'=>999,'msg'=>$res['msg'],'data'=>''];
  10. }
  11. $request->uid = $res['data']->uid;
  12. return $next($request);
  13. }

这个中间件的作用是:从请求头中读取token,然后调用TokenServer类的checkToken()方法来检测这个token是否正确,如果正确,就什么都不干,直接把请求加上一个uid后,直接next,这个next,就是下一步,假设请求路由是,token也正确,这时他会直接返回请求内容,中间件就像不存在一样,但是,一但客户没有token(未登录),或是token错误(过期),这时,他就不会返回请求内容,而是 return [ error_code 999 当然,这里也可以转向到Login登录页;提示前端登录 ,访问了需要授权登录 的页面;

注意:上面的:要注意,中间件可能在实际中是验证缓存中的token.只有登录才是验证header.或表单;

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发