자바 봄 보안 OAuth2를이 : POST를 통해 클라이언트의 자격 증명을 수락

조나단 :

나는 상당히 기본적인 봄 부팅 설정을하고 난 봄 보안을 설치하고 내가 성공적으로 내 API를 보호하기 위해 OAuth2를 설정하는 데 성공했다.

며칠 뒤 몇 가지 문제가 있었다 및 질문 질문 (및 응답) 내 타격에 관해서를 /oauth/token끝 지점을. 나는 곧 문제가 내 몸에 내 클라이언트 자격 증명을 보내려고하고 있다는 것을 알아 낸 POST요청하지만, 토큰 끝점은 클라이언트 자격 증명 (받아 봄 보안에 구성 client_id하고 secret대신 HTTP 기본 인증을 통해 참조).

OAuth2를 API를의 몸에서 클라이언트 자격 증명을 보내는 참여했다 소모와 내 경험의 대부분의 POST요청과 내가 같은 방식으로 기능에 봄 보안을 구성 할 수 있다면 궁금 해서요?

나는 다음과 같은 구성 옵션을 설정처럼, 아니 성공을 몇 가지 다른 일을 시도했지만, 나는 OAuth2를 클라이언트를 구성 할 경우에만 사용하는 것이 힘 같은 느낌 :

security.oauth2.client.clientAuthenticationScheme=form

이것은 내 인증 서버 구성입니다.

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);
    }
}
조나단 :

코멘트에 @chrylis에 의해 지적, 트릭이 사용하는 것입니다 allowFormAuthenticationForClients에 대한 방법 AuthorizationServerSecurityConfigurer인증 서버를 구성 할 때입니다. 내 경우, 나는이있는 AuthorizationServerConfig클래스 :

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

즉, 같은 본문에 표준 매개 변수를 통해 클라이언트 자격 증명을 전달 수 있습니다 POST봄이 가입하여 HTTP 기본 인증을 사용하여 선호하지만 요청 (또는 쿼리 문자열), client_idsecret(콜론과 함께을 <client_id>:<secret>),베이스 (64)는 그 결과를 인코딩 ,를 앞에 Basic하고 해당 전달 Authorization헤더, 그래서 당신은이 같은 끝낼 것입니다 :

Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l

추천

출처http://43.154.161.224:23101/article/api/json?id=191072&siteId=1