Spring OAuth2配置流程。我是否需要自己的登录控制器来登录用户以提供资源服务访问权限?

时间:2019-07-26 11:19:04

标签: java spring spring-boot oauth-2.0

我使用spring-boot 2来配置我的授权。

使读者熟悉术语:

OAuth2 server - trusted authorization server. One knows all registered clients and keeps under the control all tokens that was produced.
client - any server that uses OAuth2 server as service to verify users permissions, user identifies by oauth token (`access_token`).
user - can be any person or bot that consumes clients services. User should pass registration for any client as example.

我已经配置了OAuth2服务器。我已经配置了资源服务器。我将npm应用程序配置为从资源服务器加载数据。通常,如果用户使用Bearer令牌订阅消息,则我的资源服务器会提供所需的数据。我可以在documentation之后请求令牌。

总体上似乎没有问题。但是架构还没有完成。由于资源客户端具有自己的client-idsecret,因此用户不能直接从OAuth2服务器询问令牌。由于安全性问题,我不能将它们放到网上,因此永远不会对用户client-idsecret有所了解。

似乎我需要user的登录控制器来提供必需的access_token。规则是:OAuth2 server不应提供登录页面。

问题是:

  1. 我应该为此添加自己的控制器吗?我的期望是spring为OAuth2流提供了很多工具,如果必须的话,我会感到困惑。 (如果-如何为用户检测|配置登录端点?可能我错过了重要的事情)。
  2. 我应该使用资源服务器作为为用户提供登录功能的服务吗?如果我有不同的资源服务,并且每个人都提供登录功能,那么我认为对于开发,监视和审计来说会很不舒服。
  3. 其他任何建议。

1 个答案:

答案 0 :(得分:1)

有问题的解决方法是:

@PostMapping
public ResponseEntity<String> login(
    @RequestHeader(value = USERNAME, required = true)String username,
    @RequestHeader(value = "secret", required = true)String secret) {
  log.info("incoming login request from {} ", username);

  MultiValueMap<String, String> bodyParams = new LinkedMultiValueMap();
  bodyParams.add(GRANT_TYPE, GRANT_TYPE_PASSWORD);
  bodyParams.add(USERNAME, username);
  bodyParams.add(PASSWORD, secret);

  HttpHeaders headers = new HttpHeaders();
  headers.add(CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED_VALUE);
  HttpEntity<String> requestEntity = new HttpEntity(bodyParams, headers);
  return authenticateClientTemplate.postForEntity("http://localhost:8082/oauth/token", requestEntity, String.class);
}

但是无论如何,我正在等待优雅的解决方案。