牛刀小试~php Jwt的应用

牛刀小试~php Jwt的应用

<?php

namespace app\api\controller;

class Jwt
{
    private $alg = 'sha256';

    private $secret = "zaq1xsw2cde3vfr4bgt5nhy6mju7";

    /**
     * alg属性表示签名的算法(algorithm),默认是 HMAC SHA256(写成 HS256);typ属性表示这个令牌(token)的类型(type),JWT 令牌统一写为JWT
     */
    public function getHeader()
    {
        $header = [
            'alg' => $this->alg,
            'typ' => 'JWT'
        ];

        return $this->base64urlEncode(json_encode($header, JSON_UNESCAPED_UNICODE));
    }

    /**
     * Payload 部分也是一个 JSON 对象,用来存放实际需要传递的数据。JWT 规定了7个官方字段,供选用,这里可以存放私有信息,比如uid
     * @param $uid int 用户id
     * @return mixed
     */
    public function getPayload($uid)
    {
        $time = time();
        $payload = [
            'iss' => 'admin', //签发人
            'exp' => $time + 600, //过期时间
            'sub' => 'test', //主题
            'aud' => 'every', //受众
            'nbf' => $time, //生效时间
            'iat' => $time, //签发时间
            'jti' => 10001, //编号
            'uid' => $uid, //私有信息,uid
        ];

        return $this->base64urlEncode(json_encode($payload, JSON_UNESCAPED_UNICODE));
    }

    /**
     * 生成token,假设现在payload里面只存一个uid
     * @param $uid int
     * @return string
     */
    public function genToken($uid)
    {
        $header = $this->getHeader();
        $payload = $this->getPayload($uid);

        $raw = $header . '.' . $payload;
        $token = $raw . '.' . hash_hmac($this->alg, $raw, $this->secret);

        return $token;
    }


    /**
     * 解密校验token,成功的话返回uid
     * @param $token
     * @return mixed
     */
    public function verifyToken($token)
    {
        if (!$token) {
            return false;
        }
        $tokenArr = explode('.', $token);
        if (count($tokenArr) != 3) {
            return false;
        }
        $header = $tokenArr[0];
        $payload = $tokenArr[1];
        $signature = $tokenArr[2];

        $payloadArr = json_decode($this->base64urlDecode($payload), true);
        if (!$payloadArr) {
            return false;
        }

        //已过期
        if (isset($payloadArr['exp']) && $payloadArr['exp'] < time()) {
            return false;
        }

        $expected = hash_hmac($this->alg, $header . '.' . $payload, $this->secret);

        //签名不对
        if ($expected !== $signature) {
            return false;
        }

        return $payloadArr['uid'];
    }

    /**
     * 安全的base64 url编码
     * @param $data
     * @return string
     */
    private function base64urlEncode($data)
    {
        return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
    }

    /**
     * 安全的base64 url解码
     * @param $data
     * @return bool|string
     */
    private function base64urlDecode($data)
    {
        return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT));
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PHP JWT 接口安全示例: 1. 首先需要安装 JWT 扩展包,如果使用 composer 可以在命令行中输入 "composer require firebase/php-jwt" 来安装。 2. 生成 JWT 令牌: ``` <?php require_once "vendor/autoload.php"; use \Firebase\JWT\JWT; $secret_key = "YOUR_SECRET_KEY"; $issuer_claim = "THE_ISSUER"; $audience_claim = "THE_AUDIENCE"; $issuedat_claim = time(); // issued at $notbefore_claim = $issuedat_claim + 10; //not before in seconds $expire_claim = $issuedat_claim + 60; // expire time in seconds $token = array( "iss" => $issuer_claim, "aud" => $audience_claim, "iat" => $issuedat_claim, "nbf" => $notbefore_claim, "exp" => $expire_claim, "data" => array( "user_id" => "1", "user_name" => "John Doe", ) ); $jwt = JWT::encode($token, $secret_key); echo $jwt; ``` 3. 验证 JWT 令牌: ``` <?php require_once "vendor/autoload.php"; use \Firebase\JWT\JWT; $secret_key = "YOUR_SECRET_KEY"; $jwt = "YOUR_JWT_TOKEN"; try { $decoded = JWT::decode($jwt, $secret_key, array('HS256')); print_r($decoded); } catch (\Firebase\JWT\ExpiredException $e) { echo json_encode(array( "status" => $e->getStatusCode(), "message" => $e->getMessage() )); } catch (\Firebase\JWT\SignatureInvalidException $e) { echo json_encode(array( "status" => $e->getStatusCode(), "message" => $e->getMessage() )); } catch (\Firebase\JWT\BeforeValidException $e) { echo json_encode(array( "status" => $e->getStatusCode(), "message" => $e->getMessage() )); } catch (\Firebase\JWT\InvalidArgumentException $e) { echo json_encode(array( "status" => $e->getStatusCode(), "message" => $e->getMessage() )); } catch (\Exception $e) { echo json_encode(array( "status" => $e->getStatusCode(), "message" => $e->getMessage()

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值