【问题标题】:What Oauth2 grant type to use in a distributed application without any third party client?在没有任何第三方客户端的分布式应用程序中使用什么 Oauth2 授权类型?
【发布时间】:2017-11-25 01:17:37
【问题描述】:

在过去两天阅读了有关 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 怎么知道,一旦用户向应用授予了对资源的访问权限,下次他登录时就不需要再次访问了?

【问题讨论】:

    标签: java security oauth-2.0 microservices spring-cloud-netflix


    【解决方案1】:

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

    也写在这个nice article:

    由于这显然需要应用程序收集用户的 密码,它只能由服务本身创建的应用程序使用。 例如,本机 Twitter 应用程序可以使用此授权类型来记录 在移动或桌面应用程序中。

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

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

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

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

    【讨论】:

    • 感谢您的回答。所以,如果我理解正确的话,是 AS,在这种情况下是 Facebook 或 Google,他们有业务逻辑来验证给定用户是否已经授予了应用程序的权限。Oauth2 规范中没有任何内容说明AS 必须这样做。所以,在我的情况下,如果我使用授权码,是否由我来创建一个不要求客户端访问资源的用户权限的 AS?它可以简单地验证吗?客户端的 id 和 secret 并自动返回代码以继续流程的第二部分?
    • 嗯...我认为这取决于你。也许您可以重新检查 RFC6749 中的相关部分 3.1 以验证 - tools.ietf.org/html/rfc6749#section-3.1
    • 好吧,在第 4.1 节中它说 (B) 授权服务器验证资源所有者(通过用户代理)并确定资源所有者是允许还是拒绝客户端的访问请求。 (C) 假设资源所有者授予访问权限... 这似乎是说用户必须有权选择授权客户端。也许假设客户端是第三方应用程序。授予密码似乎是安全的,并且我们使用 TLS 来加密通信,我认为我们会使用密码,因为它看起来更简单。
    猜你喜欢
    • 2013-10-06
    • 2023-04-03
    • 2019-05-17
    • 1970-01-01
    • 2017-04-18
    • 2018-05-28
    • 1970-01-01
    • 2018-06-08
    • 2020-08-29
    相关资源
    最近更新 更多