作者:河南的小人物 | 来源:互联网 | 2023-05-17 14:58
我想使用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.请参考.如果您有任何问题,请告诉我.