PHP*_*ver 5 php authentication token hmac jwt
我使用Slim框架在PHP中开发了一些Web API,移动应用程序(iOS和Android)使用Slim框架来处理它们的请求并获取所需的数据。
最终,在每个API中,我将从移动应用程序接收到的请求发送到网站代码库中的相应功能。然后,相应的函数接受请求和请求参数,处理请求并返回所需的数据。然后,API将数据以JSON格式返回到移动应用。这是当前的工作流程。
现在,我想让网站资源(即网站的代码库和数据中的功能)的可用性受用户身份验证的约束。简而言之,我想在这种情况下实现“基于令牌的身份验证”方案。
以下是我实现“基于令牌的身份验证”后的流程:
当用户首次通过向登录API发送请求中的用户名和密码来登录系统时,成功验证该特定用户的用户名和密码组合后,将生成一个安全令牌。该安全令牌还将与用户名/密码/一些散列值一起存储在某些MySQL数据库表中,以在进一步处理中标识用户。如果验证失败,则不会生成安全令牌,并且用户也不应登录。
成功登录后,将在登录API的成功响应中将生成的安全令牌发送回用户。现在,直到用户使用每个后续请求登录为止,此令牌都将被发送到相关的API,最终将被发送到身份验证功能以对其有效性进行身份验证。
如果有任何请求,发送了无效的令牌,则应发送“请先登录”消息作为响应,并且不应访问网站资源。
用户注销后,应从数据库中删除此安全令牌条目,或对其采取任何适当的措施。
因为,这是我职业生涯中第一次从事“基于令牌的身份验证”工作,所以我对上述方法可能是错误的。如果我做错了什么,请纠正我的错误。
我找到了以下链接,但由于没有逐步说明的有效代码示例,因此发现它们没有太大用处:
使用Phalcon Micro框架的PHP HMAC Restful API
如果您可以提供完整的代码,包括数据库表的创建,PHP和MySQL之间的连接,然后创建安全令牌,检查当前登录用户的安全令牌的有效性等,那对我来说真的很棒。
另外,如果您可以给出以上两个(或两个)选项中任何一个的工作代码示例作为对此问题的答案,那也将非常好。如果除了我提供的完整工作代码示例中的两个选项之外,还有其他选择,欢迎您的答复。
注意:-请不要建议我使用OAuth身份验证过程。
以下是我自己尝试过的代码,但我不知道它是对还是错。我的方法正确还是错误?
为了创建令牌,我使用此函数,该函数将用户数据作为参数
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);
}
Run Code Online (Sandbox Code Playgroud)
因此,用户可以对自己进行身份验证,并接收一个包含令牌(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);
}
Run Code Online (Sandbox Code Playgroud)
然后,用户可以向我发送他的令牌+他的未编码数据,以便进行检查:
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
Run Code Online (Sandbox Code Playgroud)
我对吗?