Почему сервер аутентификации OAuth2 возвращает ошибку 401 с источником данных jdbc? - PullRequest
0 голосов
/ 02 декабря 2018

Я использую сервер аутентификации OAUTH2 с JWT.Если я использую токен inMemory (), я получаю доступ нормально.Однако, если я использую jdbc (dataSource), он всегда возвращает ошибку 401. Может ли кто-нибудь помочь?

Мой AuthorizationServerConfigurerAdapter

@Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.tokenStore(tokenStore()).authenticationManager(authenticationManager)
                .tokenEnhancer(jwtAccessTokenConverter()).userDetailsService(userDetailsService)
                .requestFactory(customOauth2RequestFactory.requestFactory());

    }

Мой tokenStore

@Bean
    public TokenStore tokenStore() {
        return new JwtTokenStore(jwtAccessTokenConverter());
    }

И мой jwtAccessTokenConverter

@Bean
    public JwtAccessTokenConverter jwtAccessTokenConverter() {
        var converteToken = new CustomToken();
        converteToken.setKeyPair(new KeyStoreKeyFactory(new ClassPathResource("jwt.jks"), "password".toCharArray())
                .getKeyPair("jwt"));
        return converteToken;
    }

И мой CustomToken расширяет, расширяет JwtAccessTokenConverter

    @Override
        public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) {
            var user = userRepository.findByLogin(authentication.getName());
            Map<String, Object> additionalInformation = new HashMap<>() {{

            put("idFuncionario", usuario.getIdFuncionario());
            put("idEmpresa", usuario.getIdEmpresa());
            put("perfis", usuario.descricaoPerfil());
            put("login", usuario.getLogin());
        }};
        var defaultOAuth2AccessToken = new DefaultOAuth2AccessToken(accessToken);
        defaultOAuth2AccessToken.setAdditionalInformation(additionalInformation);
        return super.enhance(defaultOAuth2AccessToken, authentication);
    }

Теперь мой JDBC в AuthorizationServerConfigurerAdapter

@Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.jdbc(dataSource).passwordEncoder(passwordEncoder());
    }

И моя CustomFactory расширяет DefaultOAuth2RequestFactory *

И мой JWT ENTITY

@Entity
@Table(name = "oauth_client_details")
public class OAuthClientDetails extends AbstractEntity {

    private String clientId;
    private String clientSecret;
    private String resourceIds;
    private String scope;
    private String authorizedGrantTypes;
    private String webServerRedirectUri;
    private String authorities;
    private Integer accessTokenValidity;
    private Integer refreshTokenValidity;
    private String additionalInformation;
    private String autoapprove;

    contructor / geters / seters

1 Ответ

0 голосов
/ 14 марта 2019

Мое решение:

Я создал этот метод в классе, который расширяет AuthorizationServerConfigurerAdapter

 @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.withClientDetails(clientService);
    }

И этот сервис:

@Service
public class ClientService implements ClientDetailsService {

    @Autowired
    private ClienteRepository clienteRepository;

    @Override
    public ClientDetails loadClientByClientId(String clientId) throws ClientRegistrationException {

        var cliente = clienteRepository.findById(clientId);


        var clienteDetail = new ClienteDetalhes(
                cliente.get().getClientId(),
                String.join(",", cliente.get().getResourceIds()),
                cliente.get().getClientSecret(),
                String.join(",", cliente.get().getScope()),
                String.join(",", cliente.get().getAuthorizedGrantTypes()),
                String.join(",", cliente.get().getRegisteredRedirectUri()),
                null,
                cliente.get().getAccessTokenValiditySeconds(),
                cliente.get().getRefreshTokenValiditySeconds(),
                cliente.get().getAutoApproveScope(),
                null);
        return clienteDetail;

    }
}

И этот объект

@Getter
@Setter
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Table(schema = "cliente")
public class ClienteDetalhes implements Serializable, ClientDetails {

    private static final ObjectMapper mapper = new ObjectMapper();

    @Id
    @Column(nullable = false, unique = true)
    private String clientId;
    private String resourceIds;
    private String clientSecret;
    private String scope;
    @Column(nullable = false)
    private String authorizedGrantTypes;
    private String registeredRedirectUri;
    private String authorities;
    @Column(nullable = false)
    private Integer accessTokenValiditySeconds;
    @Column(nullable = false)
    private Integer refreshTokenValiditySeconds;
    private String autoApproveScope;
    private String additionalInformation;

    @Override
    public boolean isSecretRequired() {
        return !StringUtils.isEmpty(this.clientSecret);
    }

    @Override
    public boolean isAutoApprove(String scope) {
        return false;
    }

    @Override
    public Map<String, Object> getAdditionalInformation() {
        try {
            return mapper.readValue(this.additionalInformation, Map.class);
        } catch (IOException e) {
            return new HashMap<>();
        }
    }

    @Override
    public Collection<GrantedAuthority> getAuthorities() {
        Set<String> set = StringUtils.commaDelimitedListToSet(this.authorities);
        Set<GrantedAuthority> result = new HashSet<>();
        set.forEach(authority -> result.add(new GrantedAuthority() {
            @Override
            public String getAuthority() {
                return authority;
            }
        }));
        return result;
    }

    @Override
    public Set<String> getRegisteredRedirectUri() {
        return StringUtils.commaDelimitedListToSet(this.registeredRedirectUri);
    }

    @Override
    public Set<String> getAuthorizedGrantTypes() {
        return StringUtils.commaDelimitedListToSet(this.authorizedGrantTypes);
    }

    @Override
    public boolean isScoped() {
        return this.getScope().size() > 0;
    }

    @Override
    public Set<String> getScope() {
        return StringUtils.commaDelimitedListToSet(this.scope);
    }

    @Override
    public Set<String> getResourceIds() {
        if (StringUtils.isEmpty(this.resourceIds)) {
            return new HashSet<>();
        } else {
            return StringUtils.commaDelimitedListToSet(this.resourceIds);
        }
    }

}

Теперь все работает нормально!

...