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

如何安全地实现"基于令牌的身份验证"以访问PHPFox中开发的网站资源(即功能和数据)?

如何解决《如何安全地实现"基于令牌的身份验证"以访问PHPFox中开发的网站资源(即功能和数据)?》经验,为你挑选了1个好方法。

我想使用PHPFox开发的网站代码中的方法和资源.

基本上,我会收到请求iPhone/Android,我会收到请求并从PHPFox代码传递给相应的函数,从该函数获取响应并将其返回给设备.

为此,我使用Slim框架开发了REST API .

但我目前面临的主要障碍是访问PHPFox网站的资源(即功能和数据).

我不明白我应该如何使用"基于令牌的身份验证"来验证用户才能访问网站的资源.

如果有人可以通过一些有用的工作示例指导我正确的方向,那对我来说真的很有帮助.

注意:"基于令牌的身份验证"的建议实施应该非常安全且速度快.安全不应以任何方式受到损害.

以下是我自己尝试的代码,但我不知道它是对还是错.我的方法是正确还是错误.请有人分析一下,让我知道你对它的反馈.

要创建令牌,我使用此功能作为参数,即用户的数据

define('SECRET_KEY', "fakesecretkey");

function createToken($data)
{
    /* Create a part of token using secretKey and other stuff */
    $tokenGeneric = SECRET_KEY.$_SERVER["SERVER_NAME"]; // It can be 'stronger' of course

    /* Encoding token */
    $token = hash('sha256', $tokenGeneric.$data);

    return array('token' => $token, 'userData' => $data);
}

因此,用户可以对自己进行身份验证并接收包含令牌(genericPart +他的数据,已编码)和未编码的hisData的数组:

function auth($login, $password)
{
    // we check user. For instance, it's ok, and we get his ID and his role.
    $userID = 1;
    $userRole = "admin";

    // Concatenating data with TIME
    $data = time()."_".$userID."-".$userRole;
    $token = createToken($data);
    echo json_encode($token);
}

然后用户可以将他的令牌+他的未编码数据发送给我,以便检查:

define('VALIDITY_TIME', 3600);

function checkToken($receivedToken, $receivedData)
{
    /* Recreate the generic part of token using secretKey and other stuff */
    $tokenGeneric = SECRET_KEY.$_SERVER["SERVER_NAME"];

    // We create a token which should match
    $token = hash('sha256', $tokenGeneric.$receivedData);   

    // We check if token is ok !
    if ($receivedToken != $token)
    {
        echo 'wrong Token !';
        return false;
    }

    list($tokenDate, $userData) = explode("_", $receivedData);
    // here we compare tokenDate with current time using VALIDITY_TIME to check if the token is expired
    // if token expired we return false

    // otherwise it's ok and we return a new token
    return createToken(time()."#".$userData);   
}

$check = checkToken($_GET['token'], $_GET['data']);
if ($check !== false)
    echo json_encode(array("secureData" => "Oo")); // And we add the new token for the next request

我对吗?

谢谢.



1> Techie..:

首先,你应该了解什么是基于令牌的身份验证.它可以解释如下.

基于令牌的身份验证系统背后的一般概念很简单.允许用户输入用户名和密码,以获取允许他们获取特定资源的令牌 - 而无需使用他们的用户名和密码.一旦获得其令牌,用户就可以向远程站点提供令牌 - 其提供对特定资源的访问一段时间.

阅读更多

现在让我们看看在REST Web服务中实现它的步骤是什么.

它将使用以下控制流程:

用户在登录表单中提供用户名和密码,然后单击"登录".

发出请求后,通过查询数据库来验证后端的用户.如果请求有效,请使用从数据库获取的用户信息创建令牌,然后在响应头中返回该信息,以便我们可以将令牌浏览器存储在本地存储中.

在每个请求标头中提供令牌信息,以访问应用程序中受限制的端点.

如果从请求标头信息中获取的标记有效,则让用户访问指定的端点,并使用JSON或XML进行响应.

有关控制流程,请参见下图

在此输入图像描述

您可能想知道什么是JWT

JWT代表JSON Web Token,是授权头中使用的令牌格式.此令牌可帮助您以安全的方式设计两个系统之间的通信.为了本教程的目的,让我们将JWT重新定义为"持票人令牌".承载令牌由三部分组成:标头,有效负载和签名.

标头是令牌的一部分,用于保存以base64编码的令牌类型和加密方法.

有效载荷包括信息.您可以放置​​任何类型的数据,如用户信息,产品信息等,所有这些数据也存储在base64编码中.

签名由标头,有效负载和密钥的组合组成.密钥必须安全地保存在服务器端.您可以在下面看到JWT架构和示例令牌;

在此输入图像描述

您不需要实现承载令牌生成器,因为您可以使用php-jwt.

希望以上解释你的困惑.如果您遇到任何实现基于令牌的身份验证的问题,请告诉我.我能帮你.


示例代码库在此处提供https://github.com/firebase/php-jwt.请参考.如果您有任何问题,请告诉我.
推荐阅读
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 【Python 爬虫】破解按照顺序点击验证码(非自动化浏览器)
    #请求到验证码base64编码json_img_datajson_raw.get(Vimage)#获取到验证码编码 #保存验证码图片到本地defbase64_to_img(bstr ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 加密、解密、揭秘
    谈PHP中信息加密技术同样是一道面试答错的问题,面试官问我非对称加密算法中有哪些经典的算法?当时我愣了一下,因为我把非对称加密与单项散列加 ... [详细]
  • 在Kubernetes上部署JupyterHub的步骤和实验依赖
    本文介绍了在Kubernetes上部署JupyterHub的步骤和实验所需的依赖,包括安装Docker和K8s,使用kubeadm进行安装,以及更新下载的镜像等。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • Apple iPad:过渡设备还是平板电脑?
    I’vebeenagonizingoverwhethertopostaniPadarticle.Applecertainlydon’tneedmorepublicityandthe ... [详细]
author-avatar
河南的小人物
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有