Auth0发布了express-oauth2-jwt-bearer,这是一个新的ExpressSDK,它使使用JWT Bearer Tokens保护API变得非常容易。让我们来概述一下它的功能。
为什么是新的Express SDK?
Auth0之前对保护Express APIs的建议是使用三个SDK的组合:Express-jwt、Express-jwt-authz和jwks-rsa。虽然这些SDK运行良好,而且很受欢迎,但我们认为开发者的体验还可以改进。
我们首先希望通过将依赖关系的数量从三个减少到一个来简化保护Express API的过程。这也使安装大小从2 MB减少到500 KB。通过比较我们实施新SDK前后的QuickStart,你可以看到这个好处,如下截图所示。

我们还想教会开发者社区如何用OAuth2.0这样的授权标准来保护他们的API,而不是用代表令牌格式、算法和行业缩写的库集合(jwt,jwks,rsa, andauthz)。
这就是为什么项目的第一个化身express-oauth2-bearer是以实验的方式发布的,以支持我们优秀的Identity Labs系列(express-oauth2-bearer现在将被废弃,改用express-oauth2-jwt-bearer)。
标准的作用
express-oauth2-jwt-bearer使用成熟的OAuth2 Bearer Token Usage规范和用于OAuth 2.0访问令牌的JSON Web Token (JWT)Profile新规范来保护Express APIs。
虽然开发者一直有一条清晰的路径来从使用承载令牌使用规范的请求中获取访问令牌,但在确定如何验证其真实性时,他们一直依赖于最佳实践和行业惯例。
有了JSON Web Token (JWT) Profile for OAuth 2.0 Access Tokens规范,他们就能够利用新的标准,以可互操作的方式消费Access Token JWT。express-oauth2-jwt-bearer部分实现了JWT Profile for OAuth 2.0 Access Tokens规范。当你启用strict 选项时,它就实现了完整的规范。此外,它还可以深度定制,因此你可以在广泛的身份提供者中使用它。
用JWT承载令牌保护Express API
express-oauth2-jwt-bearer使用与OpenID Connect Discovery类似的机制来配置自己,所以它很容易设置,只需花费最少的精力。只需几行代码,你就可以轻松地将它添加到你的API中,用Auth0发布的访问令牌来保护它,比如说。
要用Auth0轻松地保护你的Express API,首先要用npm或yarn安装SDK,如下面的例子。
npm install express-oauth2-jwt-bearer
你可以在代码中或通过环境变量初始化SDK。对于后者,最小的 .env文件看起来像下面这样。
ISSUER_BASE_URL=https://<YOUR_TENANT>.auth0.com
AUDIENCE=<YOUR_API_IDENTIFIER>
替换掉 <YOUR_TENANT>和 <YOUR_API_IDENTIFIER>用你的Auth0租户名称和API标识符的值替换,你可以在Auth0仪表板上找到。
然后像这样把express-oauth2-jwt-bearer中间件添加到你的 API 中。
const express = require('express');
const { auth } = require('express-oauth2-jwt-bearer');
require('dotenv').config(); // Load the .env variables
const app = express();
app.use(auth());
app.get('/api/private', (req, res) => {
res.json({ message: `Hello ${res.auth.payload.sub}!` });
});
app.listen(3000, () => console.log('listening at http://localhost:3000'))
然后你就可以启动你的API,用curl进行测试。
curl http://localhost:3000/api/private \
--header 'Authorization: Bearer ${YOUR_JWT_ACCESS_TOKEN}'
如果你想知道从哪里获得访问令牌,你可以在Auth0仪表板的API配置中的测试标签中获得一个用于测试的令牌,如下图所示。

查看express-openid-connect,看看如何以编程方式获得访问令牌以调用外部 API 的例子。
检查所需的作用域
如果你想额外检查Access Token对特定路由的作用域,你可以使用requiredScopes 中间件,如下图所示。
const express = require('express');
const { auth, requiredScopes } = require('express-oauth2-jwt-bearer');
require('dotenv').config();
const app = express();
const checkJwt = auth();
app.get('/api/private-scoped', checkJwt, requiredScopes('read:msg'), (req, res) => {
res.json({
message: 'You need to be authenticated and have a scope of read:messages to see this.'
});
});
你也可以使用claimCheck、claimEquals和claimIncludes来检查访问令牌中的自定义索赔(完整的API见文档)。
架构下的
express-oauth2-jwt-bearer是一个小型的Express包装器,围绕着两个与框架无关的包。
- oauth2-bearer:它从请求中获得Bearer令牌,并根据Bearer令牌使用规范发布错误。
- access-token-jwt:它使用jose库,按照OAuth 2.0访问令牌规范的JWT配置文件,验证和解码访问令牌JWTs。
下图显示了这些包之间的依赖关系。

正在发生的事情 express-jwt, express-jwt-authz,和 jwks-rsa?
express-jwt、express-jwt-authz和jwks-rsa被许多Auth0客户使用和喜爱,并保持完全支持。没有必要急于更新你现有的应用程序。我们将继续修复错误和打补丁。不过,我们计划停止向这些SDK添加新的功能,我们修复的bug的标准也会相应调整。
如果你准备开始一个新的Express API项目,我们建议使用express-oauth2-jwt-bearer,因为在可预见的未来,它将是我们在Node.js平台上所有授权创新的目标。
免费试用最强大的认证平台。开始吧→
下一步是什么
oauth2-bearer和access-token-jwt尚未发布,目前只是在node-oauth2-jwt-bearer单例中共享空间。然而,你可以看到它们可以很容易地独立使用,或者为其他Node.js服务器框架创建简单的包装,如Koa.js、Nest.js、Hapi.js。你也可以在一系列无服务器平台中使用它们,我们会将其作为未来路线图的一部分进行审查。
如果你有反馈或发现任何问题,请通过问题列表或Auth0社区联系我们。
编码愉快!