IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> tp6 openid获取 JWT中间件 -> 正文阅读

[PHP知识库]tp6 openid获取 JWT中间件

安装tp6 和配置

1安装tp6:命令: composer create-project topthink/think tp

2 创建多应用模式安装扩展

composer require topthink/think-multi-app

3 快速生成模块应用 php think build demo
4 创建模块下的 控制器类php think make:controller index@Blog

wx login登录

1 控制器登录层

<?php
declare (strict_types = 1);

namespace app\api\controller;

use app\api\model\user as UserModel;
use app\api\server\Token as TokenServer;
use think\Request;

class Login
{
    public function wxLogin(Request $request){
        //echo 1234;die();
        //获取code码
        $code = $request->get('code'); //var_dump($code);die();
        //获取微信授权url
        $url = sprintf(config('wx.url'),config('wx.AppID'),config('wx.AppSecret'),$code);
        //获取openid
        $data = curlGet($url);

       // var_dump($data);die();
        //进行查询数据库里面是否有该用户,如果没有,则进行新增
        $user = UserModel::where('openid',$data['openid'])->find();
        //如果没有用户进行创建
        if (empty($user)){
            $user = UserModel::create([
                'openid'=>$data['openid']
            ]);
        }
        //生成token,保存用户登录状态
        $token = (new TokenServer())->generateToken($user->id);
        return json(['token'=>$token,'error_code'=>0,'msg'=>'登录成功']);
        //return json(['token'=>$token,'error_code'=>0,'msg'=>'登录成功','openid'=>$user['openid']]);

    }

}

在模块下的common.php 文件里配置 系统自动生成的公共文件


<?php
// 这是系统自动生成的公共文件

function curlGet($url){
    $headerArray =array("Content-type:application/json;","Accept:application/json");
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch,CURLOPT_HTTPHEADER,$headerArray);
    $output = curl_exec($ch);
    curl_close($ch);
    $output = json_decode($output,true);
    return $output;
}

token使用

1安装jwt命令composer require firebase/php-jwt
2.在模块下创建server服务层:下的Token控制器:

<?php


namespace app\api\server;


use Firebase\JWT\JWT;

class Token
{
    protected $salt;

    public function __construct()
    {
        $this->salt = config('jwt.salt');
    }

    /**
     * 生成token
     * @param $uid
     * @return mixed
     */
    function generateToken($uid)
    {
        //获取当前时间戳
        $currentTime = time();
        $data = array(
            "iss" => 'keZuo',        //签发者 可以为空
            "aud" => '',             //面象的用户,可以为空
            "iat" => $currentTime,   //签发时间
            "nbf" => $currentTime,   //立马生效
            "exp" => $currentTime + 7200, //token 过期时间 两小时
            "data" => [              //记录的userid的信息,这里是自已添加上去的,如果有其它信息,可以再添加数组的键值对
                'uid' => $uid,
            ]
        );

        //生成token
        $token = JWT::encode($data, $this->salt, "HS256");  //根据参数生成了 token
        return $token;
    }

    /**
     * 校验token时效性
     */
    public function chekToken($token)
    {
        $status=array("code"=>2);
        try {
            JWT::$leeway = 60;//当前时间减去60,把时间留点余地
            $decoded = JWT::decode($token, $this->salt, array('HS256')); //HS256方式,这里要和签发的时候对应
            $arr = (array)$decoded;
            $res['code']=1;
            $res['data']=$arr['data'];
            return $res;

        } catch(\Firebase\JWT\SignatureInvalidException $e) { //签名不正确
            $status['msg']="签名不正确";
            return $status;
        }catch(\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用
            $status['msg']="token失效";
            return $status;
        }catch(\Firebase\JWT\ExpiredException $e) { // token过期
            $status['msg']="token失效";
            return $status;
        }catch(\Exception $e) { //其他错误
            $status['msg']="未知错误";
            return $status;
        }
    }

}

创建config 的配置文件
jwt.php

<?php return [ 'salt'=>'a426bcc5f31e42527755afa13cc5f191' ];
wx.php

<?php
return[

    'AppID' =>'wxf9c53e0a497cc457',//微信公众平台获取
    'AppSecret' => '47646ed2a1f74e056ab42cd6777cd500',
    'url' => 'https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code'
];

中间件使用

1, 安装中间命令:

php think make:middleware Check

2middleware目录下的CheckToken.php文件下 配置

<?php
declare (strict_types = 1);

namespace app\middleware;

use app\api\server\Token as TokenServer;
use think\response\Json;

class CheckToken
{
    /**
     * 处理请求
     *
     * @param \think\Request $request
     * @param \Closure       $next
     * @return Response
     */
    public function handle($request, \Closure $next)
    {
        //第一步先取token
        $token=$request->header('token');
        //jwt 进行校验token
        $res=(new TokenServer())->chekToken($token);
        if ($res['code']!=1){
            return json(['error_code'=>999,'msg'=>$res['msg'],'data'=>''],400);
        }
        $request->uid=$res['data']->uid;

        return $next($request);
    }
}

路由:

//分组路由 加中间件验证
Route::group(function (){
    //轮播图
    Route::get('slideshow','Slideshow/index');
    //文件上传wxupload
    Route::post('wxupload','Slideshow/upload');
    //查询房屋朝向属性
    Route::get('getFangAttr','Publish/getFangAttr');
    //发布出租的合租表单  AddShared
    Route::post('AddShared','Publish/AddShared');
})->middleware('check');//中间件验签

创建config 的配置文件
oss.php

<?php

return[
    "accessKeyId"=>"LTAI5tGsyR7ppvCCFWw3Ykee",
    "accessKeySecret"=>"MeQyMHXrKlnUK9nbtcUo4gm2i94p9j",
    "bucket"=>"zhaochongbin",
    "endpoint"=>"oss-cn-hangzhou.aliyuncs.com"
];

middleware.php

<?php
// 中间件配置
return [
    // 别名或分组
    'alias'    => [
        'check' => [app\middleware\CheckToken::class],
    ],
    // 优先级设置,此数组中的中间件会按照数组中的顺序优先执行
    'priority' => [],
];

阿里云上传

1 先安装,我使用composer安装
在项目的根目录运行 composer require aliyuncs/oss-sdk-php

2.在模块下创建server服务层:下的Oss控制器:

<?php


namespace app\api\server;

use OSS\OssClient;
use OSS\Core\OssException;

class Oss
{
    public function uploadFile($filePath)
    {
        // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
        $accessKeyId = config('oss.accessKeyId');
        $accessKeySecret = config('oss.accessKeySecret');
        // Endpoint以杭州为例,其它Region请按实际情况填写。
        $endpoint = config('oss.endpoint');
        // 存储空间名称
        $bucket = config('oss.bucket');
        // <yourObjectName>上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg
        $fileName = date('Y-m-d', time()) . '/' . md5(time() . rand(1111, 9999999)) . '.png';

        try {
            $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
            $result = $ossClient->putObject($bucket, $fileName, file_get_contents($filePath));
        } catch (OssException $e) {
            print $e->getMessage();
        }

        return $result['info']['url'];
    }
}

3,在控制器中;

<?php
declare (strict_types = 1);

namespace app\api\controller;

use app\api\model\Slideshow as SlideshowModel;
use app\api\server\Oss;

class Slideshow
{

    //文件上传
    public function upload()
    {
        //echo 133;die();
        //要上传文件的临时路径
        $filePath = $_FILES['file']['tmp_name'];
        //阿里云上传对象存储
        $fileName = (new Oss())->uploadFile($filePath);
        return json(['code'=>200,'msg'=>'上传成功','url'=>$fileName]);

    }
    
    //查询轮播图
    public function index(){
        $data = SlideshowModel::select()->toArray();
        return json_encode($data);
    }

}

小程序

存取Token

//缓存
wx.setStorageSync('token', token)
//取值
var tonken2 = wx.getStorageSync('token')
 
console.log(tonken2);

带Token发送请求

wx.request({
        url: 'http://www.lianxi.com/api/slideshow',
        header:{
          'token':wx.getStorageSync('token')
        },
        success:res=>{
          this.setData({
            slideshow:res.data
          })
        }
      })
      

没了
在这里插入图片描述

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-08-03 10:56:29  更:2021-08-03 10:57:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/5 14:37:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码