如何使用 NestJS 构建授权服务?

Posted

技术标签:

【中文标题】如何使用 NestJS 构建授权服务?【英文标题】:How to build authorization service with NestJS? 【发布时间】:2021-11-07 04:36:12 【问题描述】:

我需要用 NestJS 构建一个专门的授权服务。 它需要是像 google 或 discord (OAuth2) 这样的授权提供者。 为了澄清,我将提供一个例子。如下:

我有一些项目,所有这些项目都需要对用户进行身份验证和授权。 一个用户在所有这些项目上都有一个帐户。 因此,当用户想要注册或登录时,我们会将他们重定向到上述授权服务。 用户在那里创建一个帐户。 然后授权服务将用户重定向回项目。 然后项目要求(发送带有一些代码的查询字符串)服务为该用户提供令牌。 获得后,项目授予用户此令牌。 根据以下请求,用户将提供此令牌以访问项目的受保护资源。 此外,必须有一些撤销、刷新令牌的机制。

我尝试谷歌,但没有找到太多有用的文章。 有人可以提供一些有用的文章或文档链接,SO线程,任何帮助都将不胜感激。 现在我用于后端的堆栈是带有 Passport 的 NestJS。

【问题讨论】:

【参考方案1】:

感觉 OAuth 将是您的最佳选择,尽管存在学习曲线。不过,值得进一步分解您的问题 - 如果需要,我会更新我的答案。

OAuth 涉及将安全性外包给您的应用通过 HTTP(S) 调用的授权服务器 (AS):

通过多种方式进行身份验证 - Google 和其他方式 管理注册、凭据存储等 在您的 API 中识别用户并在所有情况下都对其进行授权

如果我感觉自己走上了正轨,那么这里有几个入门选项:

免费授权服务器

选择以下选项之一,这两个选项都充当“黑匣子”,提供 HTTP 端点:

云系统,例如AWS、Azure 您可以在 Docker 容器中自行运行的选项

我通常向入门者推荐第二种类型,因为它们在教育方面更好 - 并且还为连接到您自己的数据源之类的事情提供了很好的选择。以下是几个示例提供程序:

Curity Community Edition Keycloak

免费客户端

开发 Web 和移动客户端很棘手,所以从 OAuth Tools 开始,免费获得一个非常好的客户端 - 非常方便测试。

保持基于代码标准

您选择哪个选项无关紧要 - 遵循我公司在Curity Guides 中推荐的标准模式,您可以稍后切换。

【讨论】:

【参考方案2】:

Maybe this will help,它适用于谷歌表格,但对于使用 OAuth2 的任何东西,该过程应该几乎相同。仔细阅读示例代码,有点棘手。

你需要做的主要事情是:

    为 OAuth2 重定向创建和端点,它将有一个名为 code 的查询参数 创建指向 google 的 OAuth API 的链接,fx google.com/?redirect=foo.com/oauth/redirect(这几乎总是包含重定向 URL,以及您的应用对用户帐户的权限) 将用户发送到我们在 2 中生成的 URL。当他们返回时,他们将被重定向到我们在 1 中创建的端点。他们的令牌将是一个名为 code 的查询参数 生成刷新令牌,以及您想要使用令牌的任何其他“内务管理” 现在您需要向 google 执行查询/请求,询问有关用户的信息(即用户名/电子邮件),此请求的一部分将包含我们在 3./4 中获得的用户令牌。所以谷歌不只是将信息提供给任何随机数。

希望这回答了您的问题,我有点难以理解您对此的具体要求,所以请随时提出更多问题。

【讨论】:

让我澄清一下。我想为多个项目构建一个授权服务。也许 OAuth 2.0 具有误导性。我的意思是用户在我的服务中使用电子邮件/密码注册。然后他们可以使用这个帐户访问我的其他服务。就像您使用 google 帐户访问 youtube、gdrive 和 google keep 一样。一家公司,一个账户,多项服务。这是核心功能。 我建议您创建一个登录/身份验证微服务,您现有的应用程序可以查询信息或添加/删除用户(然后您还可以阻止来自外部来源的任何请求)。我不太确定您的堆栈是什么样的,但希望集成/托管这样的东西不会太难。从那里我可以看到一些可以继续的方法:使用消息代理、rest 或 graphql。我建议使用 graphql,因为它比 rest api 更酷。 如果您不想自己构建它。您也许还可以使用 Auth0 之类的东西,我用的不多,但我认为它可以实现您想要的那种功能。

以上是关于如何使用 NestJS 构建授权服务?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过部署在 Heroku 上的 Nodejs/Nestjs 服务器为我的 Angular 前端提供服务?

Nestjs websocket网关,如何从握手中解析签名cookie以进行保护授权?

如何使用捆绑包中的 node_modules 依赖项正确构建用于生产的 NestJS 应用程序?

如何在 NestJS 中设置仅 HTTP cookie

如何使用nestjs 配置winston 服务?

如何使用 NestJS 提供服务器端分页?