客户端返回服务器时验证令牌

时间:2018-07-11 22:02:11

标签: php logic token

我正在使用PHP开发API,并获得了身份验证部分,我正在使用令牌身份验证。

这是我要实现的逻辑顺序。

  1. 用户使用用户名/密码请求访问权限
  2. 应用程序验证凭据
  3. 应用程序向客户端提供一个已签名的令牌
  4. 客户端存储该令牌并将其与每个请求一起发送
  5. 服务器验证令牌并响应数据

使用示例

用户通知电子邮件和密码,{“ email”:“ emiry@hotmail.com”,“ senha”:“ 123”}

然后我发送令牌 eiy @ omlo3

每当访问API时,它将令牌传递给我

我怎么知道这个令牌是否有效?我将具有验证有效令牌的功能吗?这样做的逻辑是什么?知道令牌是否有效

1 个答案:

答案 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]进行比较,以确保令牌未被篡改,并最终确保密钥也匹配。

参考:How to Create a JSON Web Token Using PHP