我应该使用中间件还是守卫来通过 Auth0 和 nestjs 进行身份验证?

Should I be using middleware or guards to authenticate with Auth0 and nestjs?

我有一个难题。

我开始使用 NestJS 构建一个很好的老式 REST API todo 服务器。然后我使用这篇文章将 Auth0 添加到它,你使用 AuthGuard:

https://auth0.com/blog/developing-a-secure-api-with-nestjs-adding-authorization/

但是,我始终无法正常工作,总是出现 401 Unauthorized 错误。真令人沮丧。

然后我找到了这篇文章:

https://auth0.com/blog/full-stack-typescript-apps-part-1-developing-backend-apis-with-nestjs/

让我构建中间件以使用 Auth0 和 JWT 进行身份验证。瞧,它奏效了。

但感觉不对——我觉得我应该能够使用 @UseGuardsAuthGuard 以及所有 NestJS 装饰器的优点来完成整个授权操作。

所以我想我的问题有两个方面:我对使用中间件而不是 NestJS 装饰器犹豫不决是错误的吗?有没有人有一个在 NestJS 中使用装饰器的简单有效的例子?

它有点基于意见,但是,它的很大一部分在文档中并且是推荐的良好做法,所以我会尝试回答。

我强烈建议使用 @Guard。 NestJS 几乎所有的东西都使用了装饰器。它肯定是自以为是,但它以某种方式基于 Spring ,它在世界各地使用。装饰器使代码非常冗长,因为您可以清楚地看到什么适用于 class 或特定方法。

例如,我从来没有遇到过问题。 NestJS 中的 JWT 守卫。

看这里:https://docs.nestjs.com/techniques/authentication#implementing-passport-jwt

它对我来说就像一个魅力。

无论如何 - 您也可以尝试使用您的自定义 Guard for JWT,例如https://github.com/auth0/node-jwks-rsa。肯定应该更容易调试,但是,据我所知,内置的 JWT 守卫为您提供了良好的日志。

我建议将中间件用于与每一个响应或请求交互的东西,并将守卫用于所有身份验证的东西。