spring-security-oauth2 authorizedGrantTypes的配置在实践中意味着什么?

时间:2017-08-08 23:51:25

标签: spring spring-boot jhipster spring-security-oauth2

例如,在默认的jhipster UAA配置中,我们有:

clients.inMemory() .withClient("web_app") .scopes("openid") .autoApprove(true) .authorizedGrantTypes("implicit","refresh_token", "password", "authorization_code") .and() .withClient(jHipsterProperties.getSecurity() .getClientAuthorization().getClientId()) .secret(jHipsterProperties.getSecurity() .getClientAuthorization().getClientSecret()) .scopes("web-app") .autoApprove(true) .authorizedGrantTypes("client_credentials");

那么“authorizedGrantTypes”在实践中的意义何在?第一个客户端“web_app”将具有不同的类型,包括刷新,因此第二个客户端将能够生成令牌作为client_credentials。有什么区别?

另一个问题,使用“client_credentials”的第二个客户端身份验证的目的是什么?由于这与存储的真实用户断开连接。微服务到微服务通信?如果配置部署在Spring云(客户端和秘密硬编码配置)上以允许通过网关进行任何外部身份验证,那么看起来很糟糕。如何防止这种情况?

1 个答案:

答案 0 :(得分:16)

OAuth 2.0 grant types是不同的方式"您的客户端应用程序可以获取令牌。

有很多articles解释它better,但这里有一个摘要:

  • authorization_code是"经典" OAuth 2.0流程,通过重定向要求用户同意。客户端应用程序经过了严格的身份验证,因为它必须先发送所有凭据(client_id + client_secret + redirect_uri)才能获得令牌。
  • implicit与authorization_code几乎相同,但适用于公共客户端(网络应用程序或已安装/移动应用程序)。从用户的角度来看,流程几乎相同,但使用较弱的客户端身份验证。 redirect_uri是唯一的安全性,因为客户端通过重定向+请求参数接收访问令牌。
  • password很简单:客户端应用程序收集用户凭据,并发送用户凭据(username + password)和自己的凭据(client_id + client_secret)以换取代币。此流程将授权与身份验证混合在一起,并且只应在没有其他选择时使用(即您自己安装的/移动应用程序,您不希望用户在本机应用程序和浏览器之间来回切换)。您应该从不允许第三方使用此流程。

通过所有这些流程,用户被要求以某种方式获得其许可。提供给客户端的令牌只允许它访问该单个用户的数据。

client_credentials授权不同,因为它不涉及用户。它是HTTP Basic的替代品 您的客户端不会为每个请求发送用户名(client_id)+密码(client_secret),而是发送其凭据以换取令牌。

它用于服务器到服务器的通信,你想知道"哪个应用程序正在调用"通过提供不同的凭据,但您不会将其授权与特定用户联系起来。

一些例子:

  • 命令行应用程序(批处理)或工作进程使用安全服务。这种应用程序可能会立即处理一堆用户数据,并且不能请求每个用户的同意。被叫的服务必须知道"谁"正在调用以允许客户端应用程序访问任何内容。
  • 您的API的第三方/外部客户想知道未链接到用户数据的信息(例如:使用统计信息,配额,结算...)
  • 具有特殊权限的第三方/外部客户,可以访问您的所有用户'数据

注意:在服务通信服务中,您应该转发从外部接收的令牌,而不是让每个中间应用程序请求自己的令牌。