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 } }