나는 상당히 기본적인 봄 부팅 설정을하고 난 봄 보안을 설치하고 내가 성공적으로 내 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_id
및 secret
(콜론과 함께을 <client_id>:<secret>
),베이스 (64)는 그 결과를 인코딩 ,를 앞에 Basic
하고 해당 전달 Authorization
헤더, 그래서 당신은이 같은 끝낼 것입니다 :
Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l