今天,我们将讨论如何创建一个仅用于管理身份验证请求的隔离环境,以及如何有效地将其添加为中间件以保护API。
我们将遵循的一般想法是,首先,我们将创建一个常规服务器,该服务器将具有一个简单的请求,并且我们需要保护它,因此我们将创建一个中间件来接收标头并确保我们拥有正确的访问权限。我们还将使用API_KEY身份验证来防止内部使用。现在你有了基本的想法,所以让我们开始吧。
为什么我们需要身份验证服务器?
您可能想知道为什么我们需要一个身份验证服务器,难道我们不能只在一台服务器中处理吗?显然,您可以,但是当您的应用程序开始增长时,您可能需要将整体式应用程序转移到微服务级别,此策略将帮助您解决问题。
设计身份验证服务器
我们将保持简单。在我们的身份验证中,我们不会查看源或网关,而只会查看身份验证令牌和 API 密钥。首先,我创建了一个示例 Express App,其中我们刚刚导入了路由,并在存在解析器的情况下使用了默认错误处理。
快速应用程序
甚至身份验证服务器也需要保护,因此我们还将定义一个中间件规则来保护它。对于此示例,我使用的API_KEY但您也可以创建 oAuth 或基本身份验证。为了使用它,我创建了一个文件,里面有一个中间件,它将检查API_KEY,如果使用虚拟数据源出现任何问题,则会抛出错误。
接口密钥中间件
在这里,我们使用我们的虚拟数据源检查API KEYS是否存在且有效,如果情况失败,则抛出错误,否则从路由调用下一个控制器
现在,我们有一个中间件设置,我们实际上可以从API开发开始。我们将仅创建2条路线,但您可以根据需要创建任意数量的路线
登录
验证
我已经创建了一个实用程序文件,该文件将创建或验证令牌,以便我们可以直接使用控制器中的方法。我正在使用软件包来生成或验证,但您可以使用您喜欢的软件包jsonwebtoken
Jwt 实用程序函数
在这里,我们只使用和方法,但理想情况下,您还应该使用方法使您的应用程序为过期的令牌做好准备,然后该过程signverifydecode
从现在开始,我们已经设置了所有内容,让我们创建路由
路线
在这里,我们导入了所有依赖项,并创建了登录和验证的路由。在 login API 中,您可以执行任何与数据库相关的操作,然后有条件地生成令牌,但在此示例中,我跳过了该部分并直接从 发送令牌。另一方面,为了验证,我们获取授权标头,然后使用方法来验证令牌是否有效。req.body.payloadverifyToken
如果一切正常,那么在运行服务器和API后,我们将收到以下输出:
就是这样,我们的身份验证服务器已准备好响应。下一步是在任何其他微服务应用程序中使用此服务
使用身份验证服务
要使用我们刚刚创建的身份验证服务,我们需要使用 HTTP 请求提供程序。我要使用Axios,但您可以选择您选择的任何提供商
我写了一篇文章,它将帮助我们创建和使外部API调用更加敏捷。以下是本文的链接,我建议您也阅读有关此内容的信息。
如何处理公理和节点J中的不同端点
为 Axios 创建基于类的实例并有效使用它们。
javascript.plainenglish.io
服务生成器
我们将首先创建一个生成器类,该类将处理所有请求的逻辑:api_key
身份验证服务生成器
在这里,我们创建了一个类,该类将API_KEY作为构造函数参数。此类将创建一个具有标头和标头中的 axios 实例,并设置为任何 API 的超时。除了属性之外,我们还将公开将调用我们为身份验证服务创建的 API 的方法。baseURL api_key 10000ms login verify
除了生成器之外,我们还将创建一个文件,该文件将创建此类的实例并向我们公开该方法:index.js
实例创建
就是这样,我们有一个将与auth服务交互的类,并将负责管理更改单例。
创建验证中间件
现在,我们已经有了服务。下一步是创建一个中间件,为我们处理验证:
身份验证服务中间件
在这里,我们创建了一个中间件,它将从req对象中提取标头并将其传递给我们之前创建的方法。verify
创建路由
该过程的最后一步是创建路由并使用中间件。首先,我们需要导入我们创建的中间件,然后在任何测试路线上使用它。通过的情况下,所有未经授权的请求都将被阻止,只有授权的请求才能访问API。
创建路线
要测试此 API,我们需要传递在 API 上获得的授权令牌,并将其传入此处。我们不需要通过,因为它对服务级别有限制。loginapi_key
失败案例场景
如果我们没有传递令牌或传递格式错误的令牌,则会导致未经授权的请求。
通过案例场景
微服务架构的传递案例场景
我们为微服务创建了 2 个服务体系结构,但您可以增加服务以使用身份验证服务,它将在复制处理程序时完美运行。