热门标签 | 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());}}}

 


推荐阅读
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • ASP.NET MVC中Area机制的实现与优化
    本文探讨了在ASP.NET MVC框架中,如何通过Area机制有效地组织和管理大规模应用程序的不同功能模块。通过合理的文件夹结构和命名规则,开发人员可以更高效地管理和扩展项目。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 深入理解Tornado模板系统
    本文详细介绍了Tornado框架中模板系统的使用方法。Tornado自带的轻量级、高效且灵活的模板语言位于tornado.template模块,支持嵌入Python代码片段,帮助开发者快速构建动态网页。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
  • 本文详细介绍了如何在Linux系统上搭建Laravel开发环境,包括安装和配置LAMP(Linux, Apache, MySQL, PHP)服务器,以及必要的PHP扩展和Composer工具。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 本文档提供了几个经典的Java编程示例,包括多线程处理、基本程序结构以及简单的逻辑运算,旨在帮助初学者更好地理解和掌握Java语言的核心特性。 ... [详细]
  • 使用Gulp进行前端资源压缩
    本文探讨了如何利用Gulp这一强大的自动化构建工具,通过集成各种第三方插件来实现JavaScript、CSS和HTML等前端资源的高效压缩,以提升网站性能。 ... [详细]
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社区 版权所有