热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

初探PHP中的JWT认证机制

本文初步探讨了PHP中基于JWT(JSONWebToken)的身份验证机制。具体流程包括:1.客户端通过用户名和密码发起登录请求;2.服务器接收并验证用户凭证的合法性,若验证通过,则生成并返回一个JWT令牌;3.客户端接收该令牌,并在后续请求中携带此令牌以完成身份验证。这一机制不仅提高了安全性,还简化了会话管理。

使用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());}}}

 


推荐阅读
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 在 Android 开发中,通过 Intent 启动 Activity 或 Service 时,可以使用 putExtra 方法传递数据。接收方可以通过 getIntent().getExtras() 获取这些数据。本文将介绍如何使用 RoboGuice 框架简化这一过程,特别是 @InjectExtra 注解的使用。 ... [详细]
  • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
    本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
  • 本文介绍如何使用MFC和ADO技术调用SQL Server中的存储过程,以查询指定小区在特定时间段内的通话统计数据。通过用户界面选择小区ID、开始时间和结束时间,系统将计算并展示小时级的通话量、拥塞率及半速率通话比例。 ... [详细]
  • 实用正则表达式有哪些
    小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ... [详细]
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
  • 在尝试使用C# Windows Forms客户端通过SignalR连接到ASP.NET服务器时,遇到了内部服务器错误(500)。本文将详细探讨问题的原因及解决方案。 ... [详细]
  • InmyapplicationIhaveQGraphicsScenewithpixmapaddedandallisviewedinQGraphicsViewwithsc ... [详细]
  • Python + Pytest 接口自动化测试中 Token 关联登录的实现方法
    本文将深入探讨 Python 和 Pytest 在接口自动化测试中如何实现 Token 关联登录,内容详尽、逻辑清晰,旨在帮助读者掌握这一关键技能。 ... [详细]
  • 为了解决不同服务器间共享图片的需求,我们最初考虑建立一个FTP图片服务器。然而,考虑到项目是一个简单的CMS系统,为了简化流程,团队决定探索七牛云存储的解决方案。本文将详细介绍使用七牛云存储的过程和心得。 ... [详细]
  • 由二叉树到贪心算法
    二叉树很重要树是数据结构中的重中之重,尤其以各类二叉树为学习的难点。单就面试而言,在 ... [详细]
  • 深入解析MySQL中的七种JOIN查询
    本文详细介绍了MySQL中常用的七种JOIN查询方法,包括内连接、左外连接、右外连接、全外连接以及排除连接等,并通过实例进行说明。 ... [详细]
author-avatar
GRIROR格雷尔
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有