如何在Node.js和Express中使用Auth0?

125 阅读6分钟

如何在Node.js和Express中使用Auth0

了解如何将Auth0登录功能添加到Node.js/Express应用中,并使用认证的用户信息来显示/隐藏UI信息和保护API安全。

基于云的认证和授权平台--有时被称为IDaaS,或身份即服务--是一个不断扩大的云工具领域,而且很容易看出原因。应用程序的安全是困难和容易出错的,而且几乎每个项目都需要它。将大部分工作卸载给一个专门的、经过验证的服务的能力是很诱人的。

Auth0是一个新兴的认证和授权服务提供商(和开源软件)。在这篇文章中,你将看到如何将Auth0的登录功能纳入一个带有Node.js/Express后端、直接服务于JS前端的应用,然后使用认证的用户信息(通过JWT)来显示/隐藏UI信息和安全的RESTful端点。

创建一个简单的Node.js/Express应用

首先,你将建立一个简单的Express应用。首先在命令行中输入npm init 。你可以为项目名称等提供任何你喜欢的值。项目的最终代码可以在这里找到。请注意,这个示例应用程序旨在以一种简单和浓缩的方式突出安全要素,因此许多生产所需的功能,如错误处理和配置文件,都被遗漏。

接下来,通过运行npm install express ,在你运行init的同一目录下安装Express。

在你选择的代码编辑器中,在根目录下添加一个server.js文件,并将清单1的内容放入其中。

清单1.基本的server.js文件

  const express = require('express');

清单1勾勒出我们要拍摄的内容:三个API端点,一个是开放的,一个需要主动登录,一个需要登录和特定权限。

现在,在package.json文件的脚本部分添加一个开发脚本。

"dev": "nodemon server.js"

你需要安装nodemon工具。

npm install -g nodemon

现在你可以用npm run dev ,运行简单的服务器,并查看在localhost:3000/api/open的API响应。

服务静态文件

我们将使用express.static从/public/index.html为客户端提供服务。这个文件将包含所有的HTML和JS,以便于理解所有内容。这将是我们的客户端--Auth0文档中所说的单页应用(SPA)。我们的客户端将对我们上面定义的后端API进行调用。

就在server.js的app.listen 行之前,添加以下一行。

app.use(express.static(join(__dirname, "public")));

这指示Node.js为/public中的文件提供服务。现在创建文件/public/index.html,并将清单2的内容放入其中。

清单2.开始写index.html

<html>

有了清单2,你现在可以去localhost:3000/,你会发现一个基本的HTML页面,上面有三个按钮,打出了三个端点。在这个阶段,如果你点击这些按钮,所有三个按钮都会返回其结果,因为安全端点还不安全。此外,登录和注销按钮还没有做任何事情,页面底部的内容仍然隐藏着。

确保端点的安全

现在你已经到了需要一个Auth0账户的地步,这个账户对于基本使用是免费的。你可以在这里注册。当你注册时,Auth0将为你创建一个默认的 "系统API"。这是一个特殊的API,每一个租户都可以使用,并让你访问Auth0平台。公钥(在本例中是RS256的jwks)通过这个API暴露。

接下来我们将在Auth0系统中创建一个API。这是你真实世界的API(我们要保护的端点)的代表,允许你应用Auth0的能力。点击 "创建API "按钮,它将打开你在图1中看到的屏幕。

图1.创建一个Auth0 API

IDG

图1.

对于name 字段,你可以使用任何可以记忆的东西。对于identifier ,你应该使用一个URL,但你不必暴露这个URL,甚至不必拥有它--它只是一个标识符,你将在你的代码中引用。当然,在一个真实世界的项目中,你会使用你的实际域名或其他拥有的资源。对于这个表格的最后一个字段,你可以把算法保留为RS256。

使用 Auth0 API

RS256配对的公钥现在为你托管在格式为https://[your_domain].Auth0.com/.known/jwks.json的URL中。你可以通过点击旁边的 "设置 "链接找到你的新API的细节。注意你提供的标识符现在的形式是https://[your_domain].us.auth0.com/api/v2/。你很快就会看到这两个URL的运行情况。

你要做的下一步工作是定义权限。在这种情况下,你需要一个访问我们先前创建的受保护端点所需的权限。在设置页面,选择 "权限 "标签。创建一个read:protected 权限,点击 "添加 "按钮。

稍后,你将把这个权限应用到受保护的端点。

使用Express auth中间件

你将使用Express中间件来执行权限策略。继续安装清单3中的依赖项,其中分别包括Express JWT(JSON网络令牌)、JSON网络密钥和Express JWT授权扩展。请记住,JWT是一个加密的令牌,携带着授权信息。它将被用来在前端、后端和Auth0平台之间进行通信。

清单3.添加Auth依赖性

npm install --save express-jwt jwks-rsa express-jwt-authz

在server.js中添加checkJwt ,以及必要的导入,如清单4所示。注意,有一些元素(在方括号中),你将用你的细节来填写。

清单4.确保端点的安全

//...

大体上,这里发生的事情是,我们创建了一个Express中间件checkJwt ,它将检查一个有效的JSON网络令牌。这被配置为使用你先前创建的Auth0 API的信息。

请注意,issuerjwksUri 都指向你的系统API账户,这个账户是在你注册时为你创建的。同样,每个租户有一个系统API账户,而不是每个API。这个账户提供密钥(本例中是JSON网络密钥集)来签署特定API的授权信息。

audience 字段将指你创建的API的标识符,而不是系统API账户。

最后,注意到还有checkScopes ,应用于受保护的端点。这就检查了read:protected 的权限。

检查你的进展

在这一点上,如果你回到浏览器,点击 "Members Only API"(或 "Protected API")按钮,服务器将回应一个错误。

UnauthorizedError: No authorization token was found.

这是一个好兆头,说明事情开始运作了。

创建一个Auth0客户端应用程序

就像你创建了一个Auth0 API来模拟你的后端应用一样,你现在要创建和配置你的安全端点的客户端,或消费者。同样,Auth0称它们为SPA(它们过去只被称为 "客户端",在Auth0的一些文档中仍然如此)。进入Auth0仪表板,在左边的菜单中选择 "应用程序->应用程序",就在你之前配置服务器时使用的API链接上方。

现在选择 "创建应用程序 "按钮。给它起个名字(也许叫它 "客户端 "以区别于后端应用程序),并确保选择 "SPA "作为类型。点击 "创建"。

现在通过从列表中选择打开客户端应用程序。在这里你会发现你需要设置我们测试应用程序的客户端的信息:域名和客户端ID。记下这些信息;我们一会儿就会用到它。