我正在使用PHP开发API,并获得了身份验证部分,我正在使用令牌身份验证。
这是我要实现的逻辑顺序。
使用示例
用户通知电子邮件和密码,{“ email”:“ emiry@hotmail.com”,“ senha”:“ 123”}
然后我发送令牌 eiy @ omlo3
每当访问API时,它将令牌传递给我
我怎么知道这个令牌是否有效?我将具有验证有效令牌的功能吗?这样做的逻辑是什么?知道令牌是否有效
答案 0 :(得分:0)
您可以使用JWT(JSON Web令牌)标准来了解有关此过程的更多信息。 JSON Web令牌分为三部分,各部分之间用句点分隔:
header.payload.signature
通过声明令牌(例如令牌的类型和使用的算法)来创建标头:
$header = json_encode(['type' => 'JWT', 'algorithm' => 'HS256']);
More information on the difference between the signing algorithms
有效负载包含应用程序使用的重要信息,例如用户的标识符。它还可以包含其他信息,例如到期时间,发行者等:
$payload = json_encode([
'user_id' => 56,
// set expiration to 2 hours from now etc
]);
然后可以使用base64_encode()
和hash_hmac()
函数对它们进行编码。
签名是一个特殊的部分。它是标头和有效负载的串联,并附加了“秘密” 。秘密是只有您和您的应用程序才知道的字符串。将其添加到令牌中会对其进行“签名”,并使其成为唯一可以正确验证令牌的人。 This might be a good site to generate a "secret"。
您会将机密存储在可公开访问的文件夹之外的安全位置,并在需要时进行检索(dotenv libraries are great for this)。这些都被附加在一起并进行编码以创建您的令牌并赠送给客户。
当您收到要验证的令牌时,您可以将其分解为三个部分,因为每个部分之间都用句点分隔,然后根据自己的喜好验证每个部分。例如,如果您收到令牌,则可以执行以下操作:
// validate token in header.payload.signature format
$token = explode('.', $token);
$header = $token[0]; // header should be first
$payload = $token[1]; // payload should be second
$signature = $token[2]; // signature should be third
请记住,签名是标头,有效负载和机密的哈希。因此,您可以对此进行解码,并将其与$token[0]
和$token[1]
进行比较,以确保令牌未被篡改,并最终确保密钥也匹配。