Java Spring Security OAuth2: Aceitar credenciais do cliente via correio

Jonathon:

Eu tenho uma configuração bastante básico Primavera Bota e eu tenho instalado Spring Security e eu consegui configurar com êxito OAuth2 para proteger a minha API.

Eu tive alguns problemas de alguns dias atrás e pediu (e respondeu) uma pergunta com relação ao bater o meu /oauth/tokenponto final. Eu logo descobri que o problema era que eu estava tentando enviar minhas credenciais do cliente no corpo do meu POSTpedido, mas o ponto final token é configurado em Spring Security para aceitar as credenciais do cliente ( client_ide secret) através de HTTP básico Auth vez.

A maioria da minha experiência com o consumo de OAuth2 APIs envolveu o envio de credenciais do cliente no corpo do POSTpedido e eu queria saber se era possível configurar Spring Security para funcionar da mesma maneira?

Eu tentei algumas coisas diferentes, sem sucesso, como definindo a seguinte opção de configuração, mas eu sinto que só poderia ser usado ao configurar um cliente OAuth2:

security.oauth2.client.clientAuthenticationScheme=form

Esta é a minha configuração do servidor de autorização.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer;
import org.springframework.security.oauth2.provider.approval.UserApprovalHandler;
import org.springframework.security.oauth2.provider.token.TokenStore;

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
    @Autowired
    private TokenStore tokenStore;

    @Autowired
    private UserApprovalHandler userApprovalHandler;

    @Autowired
    @Qualifier("authenticationManagerBean")
    private AuthenticationManager authenticationManager;

    @Autowired
    private PasswordEncoder passwordEncoder;

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                .withClient("client_id")
                .secret("secret")
                .authorizedGrantTypes("password", "authorization_code", "refresh_token")
                .scopes("read", "write")
                .accessTokenValiditySeconds(600)
                .refreshTokenValiditySeconds(3600);
    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.tokenStore(this.tokenStore)
                .userApprovalHandler(this.userApprovalHandler)
                .authenticationManager(this.authenticationManager);
    }

    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) {
        security.tokenKeyAccess("permitAll()")
                .checkTokenAccess("isAuthenticated()")
                .passwordEncoder(this.passwordEncoder);
    }
}
Jonathon:

Como apontado por @chrylis nos comentários, o truque é usar o allowFormAuthenticationForClientsmétodo em AuthorizationServerSecurityConfigurerquando configurar o servidor de autorização. No meu caso, eu tenho isso na minha AuthorizationServerConfigclasse:

@Override
public void configure(AuthorizationServerSecurityConfigurer security) {
    security.tokenKeyAccess("permitAll()")
            .checkTokenAccess("isAuthenticated()")
            .passwordEncoder(this.passwordEncoder)
            .allowFormAuthenticationForClients();
}

Que permitirá passar credenciais do cliente através de parâmetros padrão, como no corpo do POSTpedido (ou na cadeia de consulta), embora Primavera prefere usar HTTP Básico Auth juntando-se a client_ide secretem conjunto com dois pontos ( <client_id>:<secret>), base-64 que codifica a resultado , prefixando-lo com Basice passar isso para o Authorizationcabeçalho, assim você iria acabar com algo parecido com isto:

Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=191073&siteId=1
Recomendado
Clasificación