在客户端中进行身份验证后,如何生成OAuth2访问令牌

时间:2019-10-31 17:00:23

标签: spring-security spring-security-oauth2

我正在研究Baeldung的Spring安全性和OAuth2实现。我正在运行Spring Security登录和注册项目,希望将其扩展为访问OAuth2保护的资源。该应用程序已在我的身份验证服务器上注册,但是我无法获得访问令牌。我的第二个问题涉及用户数据库在现实生活中通常存储在哪里。在Baeldung的项目中,它是在客户端应用程序中设置的,因此用户可以进行身份​​验证,但是授权服务器无权对其进行访问。我可以让授权服务器共享相同的数据库,但是我看不到这是现实情况,开发人员与创建授权和资源服务器的组织分开创建客户端应用程序。任何对此的澄清将是有帮助的。

公共类AuthorizationHeaderInterceptor实现ClientHttpRequestInterceptor {

private OAuth2AuthorizedClientService clientService;

public AuthorizationHeaderInterceptor(OAuth2AuthorizedClientService clientService) {
    this.clientService = clientService;
}

@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] bytes, ClientHttpRequestExecution execution) throws IOException {
    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
    String accessToken = null;
    OAuth2AuthenticationToken auth = (OAuth2AuthenticationToken) authentication;
    if (authentication != null && authentication.getClass().isAssignableFrom(OAuth2AuthenticationToken.class)) {
        //OAuth2AuthenticationToken auth = (OAuth2AuthenticationToken) authentication;
        String clientRegistrationId = auth.getAuthorizedClientRegistrationId();
         OAuth2AuthorizedClient client = clientService.loadAuthorizedClient(clientRegistrationId, auth.getName());
         accessToken = client.getAccessToken().getTokenValue();
         request.getHeaders().add("Authorization", "Bearer " + accessToken);
    }

    return execution.execute(request, bytes);
}

}

这时,我可以注册/登录客户端应用程序。一旦通过身份验证,用户将被发送到网页,该网页对后端进行剩余调用,并执行列出的代码。由于授权服务器不了解客户端数据库,因此我期望收到错误的凭据答复(这就是为什么我要求对实际用例进行说明)。但是,我收到此错误,却没有找到解决方法。

org.springframework.security.authentication.UsernamePasswordAuthenticationToken无法转换为org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken

0 个答案:

没有答案