php中初识jwt

使用token进行身份验证过程
1.客户端使用账号密码进行登录
2.服务端接受到请求后验证账号以及密码的正确性,若正确则服务端回传一个Token
3.客户端接收到Token后对其进行存储,每次访问时需携带token
4.服务端在接受到客户端请求时需验证token有效性,验证成功则回传数据。

生成与验证token的方法有很多种,我们这里使用的是jwt( Json Web Token)。

使用前提

首先使用方法需要在composer.json中引入firebase/php-jwt,之后进行composer安装。

名称
iss (issuer)issuer 请求实体,可以是发起请求的用户的信息,也可是jwt的签发者
sub (Subject)设置主题,类似于发邮件时的主题
aud (audience)接收jwt的一方
exp (expire)token过期时间
nbf (not before)当前时间在nbf设定时间之前,该token无法使用
iat (issued at)token创建时间
jti (JWT ID)对当前token设置唯一标示
class JWTTool extends Controller {

    public function __construct(ContainerInterface $container = null)
    {
        header("Content-Type: text/html; charset=utf-8");
        $this->setContainer($container);
    }


    private $key = 'DLWYZ';//密钥
    private $iss = "http://example.org/send";//签发者
    private $aud = "http://example.org/accept";//接受者

    /**
     * @param $data 加密的数据
     * @param int $is_exp 是否加入有效时间
     * @param int $time  有效时长
     * @return string
     */
    public function generateToken($data,$is_exp = 1,$time = 86400){
        $token['iss'] = $this->iss;
        $token['aud'] = $this->aud;
        $token['iat'] = strtotime(date('Y-m-d H:i:s'));
              if($is_exp){
            $token['exp'] = strtotime(date('Y-m-d H:i:s'))+$time;
        }
        $token['data'] = $data;
        $jwt = JWT::encode($token, $this->key);//alg,默认使用HS256方式
        return $jwt;
    }

    /**
     * 验证
     * @param $jwt
     * @param $client 平台号
     * @return array|\Symfony\Component\HttpFoundation\Response
     */
    public function verificationToken($jwt,$client)
    {
        $key = $this->key; //key要和签发的时候一样
        try {
            JWT::$timestamp = strtotime(date('Y-m-d H:i:s'));//当前时间
            $decoded = JWT::decode($jwt, $key, ['HS256']); //HS256方式,这里要和签发的时候对应

            if(empty($decoded->data)){
                throw new Exception('未登录');
            }

            if(empty($decoded->data->client)){
                throw new Exception('非法操作,端口错误');
            }

            if($decoded->data->client != $client){
                throw new Exception('非法操作,端口错误');
            }

            return Responses::arrays(
                '登录成功',
                0,
                ['user_id'=>$decoded->data->user_id]
            );
        } catch(\Firebase\JWT\SignatureInvalidException $e) {  //签名不正确
            return Responses::arrays('签名错误',1);
        }catch(\Firebase\JWT\BeforeValidException $e) {  //
            return Responses::arrays($e->getMessage(),1);
        }catch(\Firebase\JWT\ExpiredException $e) {  // token过期
            return Responses::arrays('登录凭证失效',-1);
        }catch(Exception $e) {  //其他错误
            return Responses::arrays($e->getMessage());
        }
    }

    public function verificationOther($jwt,$data)
    {
        $key = $this->key; //key要和签发的时候一样
        try {
            JWT::$timestamp = strtotime(date('Y-m-d H:i:s'));//当前时间
            $decoded = JWT::decode($jwt, $key, ['HS256']); //HS256方式,这里要和签发的时候对应

            $tag_data = (array)$decoded->data;
            foreach ($data as $k=>$v){
                if(!array_key_exists($k,$tag_data)){
                    throw new Exception('验证失败');
                }
                if($tag_data[$k] != $data[$k]){
                    throw new Exception('验证失败');
                }
            }
            return Responses::arrays(
                '验证成功',
                0,
                $data
            );
        } catch(\Firebase\JWT\SignatureInvalidException $e) {  //签名不正确
            return Responses::arrays('签名错误');
        }catch(\Firebase\JWT\BeforeValidException $e) {  //
            return Responses::arrays($e->getMessage());
        }catch(\Firebase\JWT\ExpiredException $e) {  // token过期
            return Responses::arrays('凭证失效',1);
        }catch(Exception $e) {  //其他错误
            return Responses::arrays($e->getMessage());
        }
    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JWT(JSON Web Token)是一种用于身份验证和授权的开放标准。它是一种基于JSON的安全令牌,由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。 在PHP使用JWT进行登录验证的步骤如下: 1. 安装依赖:使用Composer安装`firebase/php-jwt`库,该库提供了JWT的相关功能。 2. 生成Token:在用户登录成功后,服务器可以生成一个JWT Token并返回给客户端。生成Token的过程包括设置有效载荷信息、设置过期时间、设置密钥等。 ```php use \Firebase\JWT\JWT; // 设置有效载荷信息 $payload = array( "user_id" => $user_id, "username" => $username ); // 设置过期时间 $expiration_time = time() + 3600; // 1小时后过期 // 设置密钥 $secret_key = "your_secret_key"; // 生成Token $token = JWT::encode($payload, $secret_key); ``` 3. 验证Token:在客户端发送请求时,将Token放在请求头或请求参数。服务器接收到请求后,需要验证Token的有效性和完整性。 ```php use \Firebase\JWT\JWT; // 获取Token $token = $_SERVER['HTTP_AUTHORIZATION']; // 设置密钥 $secret_key = "your_secret_key"; try { // 验证Token $decoded = JWT::decode($token, $secret_key, array('HS256')); // Token验证通过,可以获取有效载荷信息 $user_id = $decoded->user_id; $username = $decoded->username; } catch (Exception $e) { // Token验证失败 // 处理验证失败的逻辑 } ``` 以上是使用PHP进行JWT登录验证的基本步骤。通过JWT,服务器可以生成一个安全的Token,并在每次请求时验证Token的有效性,从而实现用户身份的验证和授权。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值