在没有任何第三方客户端的分布式应用程序中使用哪种 Oauth2 授权类型?

What Oauth2 grant type to use in a distributed application without any third party client?

在过去两天阅读了有关 Oauth2 协议的内容后,我仍然需要一些帮助来弄清楚什么是最适合我们部署 Authorization Service 的系统的授权。

该应用使用 Spring Cloud, Spring Boot and Spring Security。它有一个使用 Eurekaservice discovery,所有用户的请求都通过 API gateway 到达内部网络中的不同微服务。所有这些微服务,包括网关,都使用 Zuul 代理。 Authorization Service 将是另一个将用户存储在自己的数据库中的微服务。目前有一个前端部署在网关中,并在 Angular 4 中开发。没有任何外部应用程序向我们的系统发出请求,并且会有一群具有一小组可能角色的用户将使用它并且必须使用用户名和密码登录。

在这种情况下,我们应该选择 Authentication Code grant 还是 Password grant 可以?或者根本就不是 Oauth2?我看到和读到的所有使用 Authentication Code grant 的示例都要求用户允许客户端在登录后访问资源。在我们的例子中,客户端将是网关,因此用户不应该不必授予它任何东西。 Password grant 似乎消除了这种情况,因为用户的凭据用于告诉 Authorization Service 提供令牌。我错过了什么吗?

除此之外,Authorization Services 的示例包括 FacebookGoogle。使用这些时,一旦用户在登录后授予客户端应用程序访问资源的权限,后续请求就不会显示此屏幕,他们只需要使用他们的凭据登录。此访问权限信息存储在哪里? Facebook 如何知道,一旦用户向应用程序授予对资源的访问权限,下次他登录时就不需要再次登录?

据我了解,授予密码的基本目的之一是为存储和收集用户名和密码的应用程序提供到 OAuth2 的无缝迁移路径。还有很多。

也如本文所写nice article:

Since this obviously requires the application to collect the user's password, it must only be used by apps created by the service itself. For example, the native Twitter app could use this grant type to log in on mobile or desktop apps.

在您使用 OAuth2 的情况下,密码授予对我来说仍然有意义。这主要是因为在您的技术堆栈中有很多准备使用 OAuth2 基础设施(我指的是 Spring OAuth2)。这种基础设施无缝地融入微服务架构,这将是将所有东西连接在一起的最简单和最快的方式。但理想情况下,Web 应用程序应该使用身份验证代码授权,并且您应该将用户重定向到他们进行身份验证的特殊位置(例如,Zuul 网关可能会将他们重定向到 AS 提供的页面)。不过这有点复杂,您可以申请密码授权,尤其是在您不打算连接其他应用程序的情况下。

关于你的第二个问题——FB、Google、LinkedIn——他们记得授权的应用程序。例如在 Facebook 中 - 导航到 Settings - Apps 并查看哪些应用程序有权访问您的数据:

在 LinkedIn 中 - 导航至 Account - Parnters and Third parties - Permitted Services。例如。此设置允许 HackerRank 访问用户数据:

如果您作为用户删除这些应用程序,您将被要求再次授权它们。