ThinkPHP5使用jwt进行会话验证

以往,没有做过前后端分离的项目之前,都是服务器渲染的模板,然后用cookie和session进行账号的权限验证或者是登录状态的管理。后来接触了vue和小程序之后,在进行前后端分离的时候,就会遇到权限验证和登录会话保存。因为HTTP协议是开放的,可以任人调用。所以,如果接口不希望被随意调用,就需要做访问权限的控制,认证是好的用户,才允许调用API。

JWT优点

1:服务端不需要保存传统会话信息,没有跨域传输问题,减小服务器开销。

2:jwt构成简单,占用很少的字节,便于传输。

3:json格式通用,不同语言之间都可以使用。

jwt由三部分组成:

头部(header) 载荷(payload) 包含一些定义信息和自定义信息 签证(signature)

所以这里就会用到bearer的令牌访问,就是jwt;定义:为了验证使用者的身份,需要客户端向服务器端提供一个可靠的验证信息,称为Token,这个token通常由Json数据格式组成,通过hash散列算法生成一个字符串,所以称为Json Web Token(Json表示令牌的原始值是一个Json格式的数据,web表示是在互联网传播的,token表示令牌,简称JWT)

首先我们从GitHub处用composer require firebase/php-jwt下载firebase/php-jwt,怎么用composer我就不累述了,我过去的文章里面有安装教程。

安装好了之后,我们可以新建一个user控制来测试代码的完整性,首先我们创建三个控制方法

Base.php

基础控制器base.php主要是用来验证每次接受请求的时候,验证http请求头里面是否携带了token,如何将token放到请求头里面,这个前端会做的了。

<?php

/**

* Created by PhpStorm.

* User: nobita

* Date: 2/15

* Time: 14:55

*/

namespace app\user\controller;

use think\Request;

use Firebase\JWT\JWT;

use think\Controller;

class Base extends Controller

{

    public function _initialize()

    {

        parent::_initialize();

        $this->checkToken();

    }

    public function checkToken()

    {

        $header = Request::instance()->header();

        if ($header['authorization'] == 'null'){

            echo json_encode([

                'status' => 1002,

                'msg' => 'Token不存在,拒绝访问'

            ]);

            exit;

        }else{

            $checkJwtToken = $this->verifyJwt($header['authorization']);

            if ($checkJwtToken['status'] == 1001) {

                return true;

            }

        }

    }

    //校验jwt权限API

    protected function verifyJwt($jwt)

    {

        $key = md5('nobita');

        // JWT::$leeway = 3;

        try {

            $jwtAuth = json_encode(JWT::decode($jwt, $key, array('HS256')));

            $authInfo = json_decode($jwtAuth, true);

            $msg = [];

            if (!empty($authInfo['user_id'])) {

                $msg = [

                    'status' => 1001,

                    'msg' => 'Token验证通过'

                ];

            } else {

                $msg = [

                    'status' => 1002,

                    'msg' => 'Token验证不通过,用户不存在'

                ];

            }

            return $msg;

        } catch (\Firebase\JWT\SignatureInvalidException $e) {

            echo json_encode([

                'status' => 1002,

                'msg' => 'Token无效'

            ]);

            exit;

        } catch (\Firebase\JWT\ExpiredException $e) {

            echo json_encode([

                'status' => 1003,

                'msg' => 'Token过期'

            ]);

            exit;

        } catch (Exception $e) {

            return $e;

        }

    }

}

Login.php

登录控制器,只要是用来验证用户输入的账号密码是否匹配数据库的信息,如果匹配的话,就申请token,并且返回token给前端储存在本地,每次请求的时候把token假如到请求头里面

<?php

/**

* Created by PhpStorm.

* User: nobita

* Date: 2/15

* Time: 14:55

*/

namespace app\user\controller;

use app\common\model\nobita\Test as TestModel;

use Firebase\JWT\JWT;

class Login

{

    public function index()

    {

        $data = input('post.');

        $username = htmlspecialchars($data['username']);

        $password = htmlspecialchars($data['password']);

        $user = TestModel::where('username', $username)->find();

        if (!empty($user)) {

            if ($username === $user['username'] && $password === $user['password']) {

                $msg = [

                    'status' => 1001,

                    'msg' => '登录成功',

                    'jwt' => self::createJwt($user['id'])

                ];

                return $msg;

            } else {

                return [

                    'status' => 1002,

                    'msg' => '账号密码错误'

                ];

            }

        } else {

            return [

                'status' => 1002,

                'msg' => '请输入账号密码'

            ];

        }

    }

    public function createJwt($userId)

    {

        $key = md5('nobita'); //jwt的签发密钥,验证token的时候需要用到

        $time = time(); //签发时间

        $expire = $time + 14400; //过期时间

        $token = array(

            "user_id" => $userId,

            "iss" => "https://199508.com",//签发组织

            "aud" => "https://199508.com", //签发作者

            "iat" => $time,

            "nbf" => $time,

            "exp" => $expire

        );

        $jwt = JWT::encode($token, $key);

        return $jwt;

    }

}

User.php

用来验证代码的完整性

<?php

/**

* Created by PhpStorm.

* User: nobita

* Date: 2/15

* Time: 15:24

*/

namespace app\user\controller;

use think\Request;

use app\common\model\nobita\Test as TestModel;

class User extends Base //继承基础控制器

{

    public function index()

    {

        return TestModel::all();

    }

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容