JWT项目-Firebase/Php-JWT-使用JWT从服务器获取数据

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

在本项目教程中,我们将使用JWT或者JSON Web令牌从服务器获取数据。

在上一教程中,我们学习了如何生成和验证JWT。

登录

打开我们在简介教程中创建的script.js文件。

我们将调用用户验证API。

API: http://localhost/jwt-php-project/api/user
METHOD: POST
DATA: {
  "email": {email},
  "password": {password}
}

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

{
  "code": 200,
  "status": "success",
  "message": "Valid login credentials.",
  "userid": "u1",
  "jwt": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyaWQiOiJ1MSIsImlhdCI6MTUyMzgwMTA3OSwiZXhwIjoxNTIzODAxMTM5fQ.ProXLhQbSEqfwj3DAqdJQSJmT8q2JgAw_uJP3BgiSmg"
}

为了验证用户登录凭据,我们将编写以下简单的jQuery代码。

$('#login').on('submit', function (e) {

  //login
  $.ajax({
    url: './api/user',
    type: 'POST',
    data: JSON.stringify({
      email: $('#login-email').val(),
      password: $('#login-password').val()
    }),
    success: function (data) {
      var html = "<pre>" + JSON.stringify(data, null, 2) + "</pre>" +
        "<hr>" +
        "<button class='btn btn-primary' id='getuser' data-jwt='" + data.jwt + "'>Get User Detail</button>" +
        "<hr>" +
        "<div id='detail-container'></div>";
      $('#result-container').html(html);
      $('#login')[0].reset();
    },
    error: function () {
    }
  });

  return false;
});

在上面的代码中,我们正在监听登录表单Submit事件。

在提交表单时,我们将使用用户提供的电子邮件地址和密码,然后调用API进行验证。

如果输入的详细信息正确,我们将获得成功答复。

上面的成功响应包含为提供的用户登录凭据生成的" jwt"。

我们将使用此JWT值来获取用户详细信息。

注意!我们还具有"获取用户详细信息"按钮,单击该按钮将通过使用生成的JWT调用API来使用用户详细信息。

获取用户详细信息

为此,我们将调用获取用户详细信息API。

API: http://localhost/jwt-php-project/api/user
METHOD: GET
PARAMETER: jwt={jwt}

如果传递给服务器的jwt值有效,那么我们将返回以下响应。

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

因此,为了获得用户详细信息,我们将编写以下代码,这些代码将在单击按钮时触发。

$('body').on('click', '#getuser', function (e) {
  var jwt = $(this).attr('data-jwt');

  //get user detail
  $.ajax({
    url: './api/user',
    type: 'GET',
    data: {
      jwt: jwt
    },
    success: function (data) {

      if (data.status === 'success') {

        var lifespan = Number(data.jwt_payload.exp - data.jwt_payload.iat);  //in ms

        var html = "<p>For this demo JWT will expire after " + lifespan + " seconds.</p>" +
          "<pre>" + JSON.stringify(data, null, 2) + "</pre>";
        $('#detail-container').html(html);

        setTimeout(function () {
          $('#detail-container').html('<p>JWT expired!</p>');
        }, lifespan * 1000);

      } else {
        var html = "<pre>" + JSON.stringify(data, null, 2) + "</pre>";
        $('#detail-container').html(html);
      }

    },
    error: function () {
    }
  });

});

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

注意!对于此演示项目,JWT设置为在60秒后过期。

因此,到期后,我们将看到以下消息。

到期后,如果我们尝试单击"获取用户详细信息"按钮以获取用户详细信息,我们将收到无效的JWT消息。