2020-07-03 08:45

如何使用JSON Web令牌保护REST API

  API安全性非常重要,并且比以往任何时候都受到关注。在这里,了解如何使用JSON Web令牌实现用户身份管理和授权。您是否注意到认证的工作原理?所有抽象和复杂性背后是什么?其实没什么特别的。加密值是一种依次创建用户用作标识符的唯一令牌的方法。令牌可验证用户的身份,并可以验证您的身份并批准您有权访问的各种资源。如果你想了解更多内容,请联系我们济南网站建设

  从实际出发,JWT实际上意味着什么?让我们来分解一下官方的定义:

  JSON Web令牌在正式定义中实际上意味着什么?让我们弄清楚。

  “ JSON Web令牌(JWT)是一种紧凑的,URL安全的方法,用于表示要在两方之间转移的声明。JWT中的声明被编码为JSON对象,用作JSON Web签名(JWS)结构的有效负载或JSON Web加密(JWE)结构的纯文本,从而使声明可以进行数字签名或完整性保护带有消息认证码(MAC)和/或加密。”

  –互联网工程任务组(IETF)

  使用JWT保护Restful API当用户在身份验证过程中成功使用其凭据登录时,将返回JSON Web令牌,并且必须将其本地保存在本地存储中。每当用户想要访问受保护的资源或路由时,通常必须在带有请求的Authorization标头Bearer Schema中将JWT发送到用户代理。

  接下来,当后端服务器收到带有请求的JWT时,首先要做的是验证令牌。以下列表包含一系列步骤。如果其中任何一个失败,则该请求必须被拒绝。

  •检查JWT的格式是否正确

  •检查签名

  •验证标准声明

  •检查客户端权限(范围)

  在开始解释Node.js和某些ECMAScript标准之前,您必须了解一些事情。如我们所料,您已经知道如何使用Node.JS构建RESTful API。该博客不会涉及细节,但是这些资源可以提供有关JWTS及其验证的更多信息。

  让我们开始编写一些代码!考虑了所有事情,实际上还没有。我们必须首先设置环境。该代码应至少保留几分钟。这部分很累,因此为了快速启动和运行,我们将从上面的指导教程中克隆存储库。打开终端窗口或运行以下命令:

  git clone https://github.com/adnanrahic/nodejs-restful-api.git

  您会找到一个文件夹,只需打开它即可。看一下文件夹结构。

  >用户

  -User.js

  -UserController.js

  -db.js

  -server.js

  -app.js

  -package.json

  我们有一个带有模型和控制器的客户文件夹,并且有效执行了基本CRUD。我们的app.js包含基本安排。db.js确保应用程序与数据库连接。server.js确保我们的服务器启动。

  简单地介绍所有必需的Node模块。切换回您的终端窗口。确保您位于名为“ nodejs-restful-api”的信封中,然后运行npm install。请稍等一会儿,以介绍这些模块。当前,您必须在db.js中包括数据库关联字符串。

  现在,您可以在终端窗口中键入node server.js重新启动服务器。

  继续并启动服务器,回到终端窗口中,键入node server.js。您应该看到在端口3000上侦听的Express服务器被记录到终端。

  签出一些代码我们应该首先概念化我们需要构建的内容。最重要的是,我们需要包括客户端验证。它表示,执行用于注册和登录用户的框架。

  另外,我们需要包括批准。该演示是允许客户授权访问我们REST API上的特定资产。

  首先在项目的根目录中包含另一个记录。给它起一个名字config.js。在这里,您将放置应用程序的排列设置。现在,我们只需要为JSON Web令牌表征一个神秘密钥即可。

  // config.js

  module.exports = {

  '秘密':'超级秘密'

  };

  有了这个附加功能,您就准备开始包括身份验证。创建一个名为auth的信封,并首先包含一个名为AuthController.js的文档。该控制器将成为我们身份验证逻辑的家。

  将这段代码添加到AuthController.js的最高点。

  // AuthController.jsvar express = require('express');

  var router = express.Router();

  var bodyParser = require('body-parser');

  router.use(bodyParser.urlencoded({Extended:false}));

  router.use(bodyParser.json());

  var User = require('../ user / User');

  现在,您的系统已准备就绪,可以放入模块中以利用JSON Web令牌和加密密码。使用此代码进入AuthController.js:

  var jwt = require('jsonwebtoken');

  var bcrypt = require('bcryptjs');

  var config = require('../ config');

  您必须在项目文件夹中打开一个终端窗口。现在安装以下模块:

  npm install jsonwebtoken-保存

  npm install bcryptjs-保存

  您已准备好创建或注册端点。将此代码插入您的AuthController.js:

  router.post('/ register',function(req,res){

  var hashedPassword = bcrypt.hashSync(req.body.password,8);

  User.create({

  名称:req.body.name,

  电子邮件:req.body.email,

  密码:hashedPassword

  },

  功能(错误,用户){

  if(err)return res.status(500).send(“注册用户时出现问题。”)//创建一个令牌

  var token = jwt.sign({id:user._id},config.secret,{

  expiresIn:86400 // 24小时内到期

  }); res.status(200).send({auth:true,token:token});

  });

  });

  res.status(200).send({auth:true,token:token});

  });

  });

  在这里,我们预计客户应向我们发送三个值,即名称,电子邮件和密码。我们将立即获取密钥,并使用Bcrypt的哈希方法对其进行编码。此时,请使用哈希密码,并输入名称和电子邮件并建立新用户。有效地创建用户后,我们很乐意为该用户创建令牌。

  jwt.sign()技术将有效负载和config.js中描述的密钥作为参数。它使有效负载说话的字符系列异常多。对于我们的情况,有效负载是仅包含客户端ID的抗议。考虑到我们再次从注册端点获得的令牌,我们应该编写一些代码来获取客户端ID。

  router.get('/ me',function(req,res){

  var token = req.headers ['x-access-token'];

  如果(!token)返回res.status(401).send({auth:false,消息:'未提供令牌。'));

  jwt.verify(令牌,config.secret,function(err,decoded){

  如果(err)返回res.status(500).send({auth:false,消息:“无法验证令牌。”});

  res.status(200).send(decoded);

  });

  });

  在这里,我们期望令牌将与请求一起发送到标头中。HTTP询问标头中令牌的默认名称是x-access-token。如果没有令牌给出请求,服务器将发回错误。更确切地说,系统显示401未批准状态,其响应消息为“未提供令牌”。如果令牌存在,则将调用jwt.verify()策略。这项技术可以解开令牌,从而可以看到第一个有效负载。如果有错误,我们将进行处理,如果没有,将已解码的激励发送回响应。

  最后,我们必须将课程添加到主app.js文档中的AuthController.js中。首先从AuthController.js发送开关:

  //将其添加到AuthController.js的底部

  module.exports =路由器;

  在您导出应用程序的位置,向主应用程序中的控制器添加引用。

  // app.js

  var AuthController = require('./ auth / AuthController');

  app.use('/ api / auth',AuthController);

  module.exports =应用程序;

  包起来!当我们讨论如何保护RESTful API时,我们希望在不久的将来对它们进行介绍。退后一步,休息一会儿再试一次是很好的。Unified Infotech是纽约市一家很有前途的网站开发公司,可为每个问题提供世界一流的解决方案。如果你想了解更多内容,请联系我们济南网站建设