JWT项目-Firebase/Php-JWT-生成JWT

时间:2020-02-23 14:46:19  来源:igfitidea点击:

在本项目教程中,我们将学习使用firebase/php-jwt包为用户生成JWT或者JSON Web令牌。

在该项目的入门教程中,我们完成了设置过程。

生成JWT

JSON Web令牌由三部分组成-标头,有效负载和签名。

对于这个项目," header"设置为以下内容。

{
  "typ": "JWT",
  "alg": "HS256"
}

有效载荷将类似于以下内容。

{
  "userid": "u1",
  "iat": 1523798197,
  "exp": 1523798257
}

其中," userid"存储登录用户的用户ID。

" iat"代表发布,这是JWT发布的时间。

exp表示到期时间,它是JWT不再有效的时间。

对于这个项目,我将" this-is-the-secret"用作" JWT"签名的" secret"。

用户帐号

为简单起见,我将用户详细信息保存在数组中。
您可以将详细信息保存在数据库表中,并根据需要进行检索。

如果您想参与数据库以及其他所有不错的工作,请查看我的jwt-codeigniter-project。

好了,回到这个项目。

在以下数组中,我们有两个用户帐户。

/**
 * FOR DEMO PURPOSE
 * I have created two accounts
 * Password of the accounts: root1234
 */
$userAccountArr = array(

  array(
    "userid" => "u1",
    "email" => "@example.com",
    "password" => "yPfY4lNCR62/HH9aNGZFcebloX1gACQIbWeHfTwb8hKhMXfymiNLq",
    "firstname" => "",
    "lastname" => ""
  ),

  array(
    "userid" => "u2",
    "email" => "[email protected]",
    "password" => "yPfY4lNCR62/HH9aNGZFcebloX1gACQIbWeHfTwb8hKhMXfymiNLq",
    "firstname" => "Example",
    "lastname" => "User"
  )

);

您可以在我的GitHub存储库jwt-php-project中找到该项目的完整代码。

如何生成JWT?

用户将输入注册的电子邮件地址和密码之一进行登录。

如果凭据匹配,我们将使用以下代码生成JSON Web令牌。

$issuedAt = time();
$expirationTime = $issuedAt + 60;  //jwt valid for 60 seconds from the issued time
$payload = array(
  'userid' => $userid,
  'iat' => $issuedAt,
  'exp' => $expirationTime
);
$key = JWT_SECRET;
$alg = 'HS256';
$jwt = JWT::encode($payload, $key, $alg);

其中,$userid变量保存已登录用户的用户ID。

" JWT_SECRET"是一个常量,并且保留值" this-is-the-secret"。

我们在JWT的签名部分使用了HMAC SHA256哈希算法。

我们使用JWT :: encode()方法并传递$payload,$key和$alg三个参数来生成JWT。

在上面的代码中,我们将JWT的到期时间设置为从发出时间起60秒。
随时将其更改为您喜欢的任何内容。

如何验证JWT?

为此,我们将使用JWT :: decode()方法。

JWT::decode($jwt, $key, array('HS256'));

在上面的代码中,$jwt保存JSON Web令牌值。

$key拥有秘密密钥。
使用的哈希算法是" HMAC SHA256"。

API

对于此演示项目,我创建了两个API。
第一个是验证用户登录凭证,第二个是使用为已登录用户发出的JWT来获取用户详细信息。

验证API

对于此API,我们将传递注册的电子邮件地址和密码。

{
  "email": "@example.com",
  "password": "root1234"
}

API网址为" http://localhost/jwt-php-project/api/user",方法为" POST"。

您的API网址可能会更改,具体取决于您的开发服务器设置。

成功后,我们将从本地服务器获取以下响应。

{
  "code": 200,
  "status": "success",
  "message": "Valid login credentials.",
  "userid": "u1",
  "jwt": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyaWQiOiJ1MSIsImlhdCI6MTUyMzgwMDk0NSwiZXhwIjoxNTIzODAxMDA1fQ.zz4bkTjU5K_RukfHkKjD2t-HvR73RlAsVoPShEW3fN8"
}

获取用户详细信息API

对于此API,我们在URL中传递JWT值。

带有jwt参数的示例API如下所示。

http://localhost/jwt-php-project/api/user?<span style="color: blue;">jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyaWQiOiJ1MSIsImlhdCI6MTUyMzgwMDk0NSwiZXhwIjoxNTIzODAxMDA1fQ.zz4bkTjU5K_RukfHkKjD2t-HvR73RlAsVoPShEW3fN8</span>

成功后,我们将从本地服务器收到以下响应。

{
  "code": 200,
  "status": "success",
  "data": {
    "userid": "u1",
    "email": "@example.com",
    "firstname": "",
    "lastname": ""
  },
  "jwt_payload": {
    "userid": "u1",
    "iat": 1523800945,
    "exp": 1523801005
  }
}