我目前正在使用 spring-security 和 spring boot 来研究 OAuth2。虽然这个协议(protocol)的概念对我来说很清楚,但实现细节却不清楚(spring 没有提供很多可以使用的示例和教程)。因此,我将非常感谢您回答以下问题:
- “密码”授予类型的目的是什么? OAuth2 规范没有提到这一点。这只是 Spring 实现的某种“授权快捷方式”吗?
- 资源服务器如何处理访问 token (检查它是否仍然有效、范围等)?我是否需要实现一些东西,或者它是由 Spring Security 和 ResourceServerConfig 提供的?
- RS 如何知道哪个用户(不是客户端)请求了资源?具体的用户资源是与id、唯一用户名等绑定(bind)的,token有这类信息吗?如何检索它以便在资源 Controller 中使用?
授权服务器(如果我错了请纠正我)能够检查客户端应用程序是否有权访问所请求的资源。据我了解,它不应该知道用户(资源所有者)。在我通过 Google、Facebook 或其他一些服务进行身份验证的情况下,用户身份验证就是他们的情况。如果 OAuth2 和资源服务器是一个应用程序(我目前正在开发这样一个用于测试目的)的应用程序,我应该将 UserDetailsService 放在哪里?如何组合它以便首先授权客户端(在本例中是从应用程序生成的js),然后是用户(资源所有者)并生成 token ?目前我已经实现了 ClientDetailService 并注入(inject)到配置中。我应该在哪里注入(inject)UserDetailService?
@Configuration @EnableAuthorizationServer public class OAuth2Config extends AuthorizationServerConfigurerAdapter { @Autowired private AuthenticationManager authenticationManager; @Autowired private MongoClientDetailsService cds; @Override public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { endpoints.authenticationManager(authenticationManager); } @Override public void configure(ClientDetailsServiceConfigurer clients) throws Exception { clients.withClientDetails(cds); } }
是否有一些 JS 库可以帮助自定义应用程序的授权流程,例如支持(据我所知)众所周知的服务的 hello.js?
如有任何帮助,我们将不胜感激:)
最佳答案
有很多问题;让我首先回答 3:
值为
password
的grant_type
是资源所有者密码凭证授予类型的官方保留值,如此处规范所示:https://www.rfc-editor.org/rfc/rfc6749#section-4.3.2所以它不是 Spring 特定的或自定义的如果 token 是独立且结构化的(例如 JWT),RS 可以验证 token 本身,否则它将需要回调授权服务器来验证它
第 2 步的验证结果可能包括有关授予客户端访问权限的用户(或:资源所有者)的信息
关于java - 使用 OAuth2 在 Spring Security 中进行用户授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27707971/