如何使用 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以进行保护授权?