【问题标题】:How to authorize against an OpenId Connect secured REST-API programmatically?如何以编程方式授权 OpenId Connect 保护的 REST-API?
【发布时间】:2020-05-09 00:08:15
【问题描述】:

我已经实现了一个基于 Spring Security 5.2 OpenID Connect 资源服务器保护的 Spring Boot 的 REST-API。授权服务器是 IdentityServer4。到目前为止一切顺利,使用 Bearer Token(令牌通过虚拟网页确定)的身份验证效果很好。

现在的挑战是从不需要用户交互(网页)的客户端调用 REST API。

我想为 API 用户提供一个不安全的端点(/授权),该端点可用于接收承载令牌以进行任何进一步的安全服务。用户名和密码应作为请求参数传递。

我已经在网上搜索并研究了 Spring 的文档,但我没有找到可以解决我的用例的内容。

【问题讨论】:

  • 如果您在 HTTPS 上进行通信,那么您是安全的,但如果您想使用唯一的 HTTP,那么您需要注意加密/解密机制。
  • 是的,所有通信都是通过https

标签: spring-boot openid-connect spring-security-oauth2


【解决方案1】:

我实现了一个比较简单的解决方案

@GetMapping
public ResponseEntity<GetTokenResponse> getToken(@RequestBody GetTokenRequest getTokenRequest) {

    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

    MultiValueMap<String, String> formData = new LinkedMultiValueMap<>();
    formData.add("client_id", clientId);
    formData.add("client_secret", clientSecret);
    formData.add("grant_type", "password");
    formData.add("scope", scopes);
    formData.add("username", getTokenRequest.getUsername());
    formData.add("password", getTokenRequest.getPassword());

    RestTemplate restTemplate = new RestTemplate();
    HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(formData, headers);
    ResponseEntity<GetTokenResponse> response = restTemplate.postForEntity( tokenEndPoint, request , GetTokenResponse.class );

    String accessToken = response.getBody().getAccessToken();

    NimbusJwtDecoder decoder = NimbusJwtDecoder.withJwkSetUri(jwkSetUri).build();
    Jwt jwt = decoder.decode(accessToken);
    logger.debug("Headers:\n{}", jwt.getHeaders());
    logger.debug("Claims:\n{}", jwt.getClaims());
    logger.info("User {}, {} '{}' authorised.", jwt.getClaimAsString("given_name"), jwt.getClaimAsString("family_name"), jwt.getClaimAsString("sub"));

    return response;
}

响应包含不记名令牌,因此可用于 API 调用。

【讨论】:

  • 用户名、密码、client_id 和 client_secret 都是纯文本,Wireshark 等软件可以读取 HTTP 上的标头。建议使用 HTTPS 安全地传递您的令牌。如果你想使用 HTTP,那么你需要加密数据(用户名,密码..)并发送它,所以它对入侵者没有任何意义。
猜你喜欢
  • 2018-09-28
  • 2020-09-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 2017-05-05
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
相关资源
最近更新 更多