JWT项目-Firebase/Php-JWT-生成JWT
在本项目教程中,我们将学习使用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
}
}

