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

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

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

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

【问题讨论】:

    标签: typescript authentication oauth-2.0 passport.js nestjs


    【解决方案1】:

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

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

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

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

    免费授权服务器

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

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

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

    免费客户端

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

    保持基于代码标准

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

    【讨论】:

      【解决方案2】:

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

      你需要做的主要事情是:

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

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

      【讨论】:

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