我需要用NestJS建立一个专用的授权服务。它需要像google或discord(OAuth2)那样的授权提供者。为了澄清,我将提供一个示例。如下所示:
我有一些项目,所有这些项目都需要对用户进行身份验证和授权。一个用户在所有这些项目上都有一个帐户。因此,当用户想要注册或登录时,我们将它们重定向到上面提到的授权服务。用户在那里创建一个帐户。然后授权服务将用户重定向回项目。然后项目询问(发送带有一些代码的查询字符串)服务为该用户提供令牌。获得令牌后,项目将赠款用户该令牌。在随后的请求中,用户将提供该令牌以访问项目的受保护资源。此外,必须有一些撤销、刷新令牌的机制。
我试着用谷歌搜索,但是没有找到很多有用的文章。有人能提供一些有用的文章或文档的链接吗,所以线程,任何帮助都将不胜感激。现在我用的后端栈是NestJS与Passport。
3条答案
按热度按时间bmp9r5qi1#
这是一个老帖子了,但我相信OP的初衷是创建一个OAuth2服务器,作为客户端应用程序的身份服务提供者运行--而不是作为已建立的第三方身份验证服务的客户端应用程序。OP还指定他们使用NestJS框架作为堆栈,并使用Passport身份验证中间件。
尽管加里Archer的回答推荐了一个优秀的现成的Curity解决方案,但OP或其他用户可能希望在代码中实现一些更“动手”的东西:无论是为了他们自己的学习,还是作为对另一个项目的整合。下面是我自己在一个类似项目中采取的一般步骤-我不打算在这里得到太多的规定,因为具体情况会因项目而异!
阅读OAuth2
在尝试之前,我建议您确保熟悉OAuth2的核心机制--尤其是“授权代码”授权类型过程,因为这很可能是您将用于大多数用户交互式应用程序的过程。Digital Ocean have produced an excellent guide,在深入研究代码之前,这是非常值得一读的。即使您了解OAuth2工作原理的基础知识,值得快速复习一下--相信我,如果你没有牢固掌握这一点,你以后会遇到麻烦的!
实现OAuth2服务器
关于OAuth2服务器的实现,可能会对以下GitHub项目感兴趣:https://github.com/toondaey/nestjs-oauth2-server。它提供了在NestJS中实现完全自定义的OAuth2服务器所需的框架。如文档中所述,它要求开发人员提供一个模型,以与标识存储集成并实现验证,还要求配置处理程序端点。
所有这些对于典型的实现都应该是相当简单的,在这种实现中,只需要一个简单的OAuth2身份提供者,授权和其他功能由客户端应用程序内部处理,至少,您需要告诉授权服务器如何存储和检索所需的数据,提供任何验证逻辑,如范围检查,以及创建用于客户端认证至少一个处理程序端点。
客户端验证
根据OP声明的假设,如果上述解决方案作为专用的独立OAuth2服务实现,则通过此服务使用Passport's generic OAuth2 strategy集成身份验证应该很简单。
z18hc3ub2#
感觉 OAuth 将 是 您 的 最 佳 选择 , 尽管 有 一 个 学习 曲线 。 但 值得 进一步 分解 您 的 问题 - 如果 需要 , 我 会 更新 我 的 答案 。
OAuth 涉及 将 安全 性 外包 给 应用 程序 通过 HTTP ( S ) 调用 的 授权 服务 器 ( AS ) :
如果 这 感觉 像 我 在 轨道 上 , 那么 这里 有 几 个 选择 开始 :
选择 以下 选项 之 一 , 这 两 个 选项 都 充当 " 黑 盒 " , 提供 HTTP 端点 :
我 通常 推荐 第 二 种 类型 的 提供 程序 给 初学 者 , 因为 它们 更 有 教育 意义 - - 并且 也 为 连接 到 自己 的 数据 源 提供 了 很 好 的 选择 。 下面 是 几 个 示例 提供 程序 :
开发 Web 和 移动 客户 端 是 很 棘手 的 , 所以 从 OAuth Tools 开始 , 免费 获得 一 个 非常 好 的 客户 端 - - 非常 方便 测试 。
您 选择 哪个 选项 应该 不 重要 - 遵循 标准 模式 , 就 像 我 的 公司 在 Curity Guides 中 推荐 的 那样 , 您 可以 稍后 切换 。
3xiyfsfu3#
Maybe this will help,这是针对google工作表的,但是对于使用OAuth2的任何东西来说,这个过程都应该是差不多的。
你需要做的主要事情是:
1.为OAuth2重定向创建端点,它将具有名为
code
的查询参数1.创建指向google的OAuth API的链接fx
google.com/?redirect=foo.com/oauth/redirect
(这几乎总是包含重定向URL,以及您的应用对用户帐户的权限)1.将用户发送到我们在2中生成的URL。当他们返回时,他们将被重定向到我们在1中创建的端点。他们的令牌将是名为
code
的查询参数1.生成刷新令牌,以及需要使用这些令牌的任何其他“内务处理
1.现在你需要执行一个查询/请求到谷歌,要求有关用户的信息(即用户名/电子邮件),这个请求的一部分将包含用户的令牌,我们在3./4.所以谷歌不只是给予任何随机信息。
希望这回答了你的问题,我有一点坚韧理解你具体想要从这一点,所以请随时问更多。