2013-01-03 4 views
15

새로운 REST 서버와 기존 클라이언트 앱 간의 클라이언트 자격 증명 흐름을 이해하고 구현하려고합니다. this과 같은 스프링 보안 OAuth2를 설정했습니다. 지금까지 나의 이해에서 내 서버는 이제 다음과 같은 요청을 지원해야한다 :OAuth2 클라이언트 자격 증명 흐름 이해

$ curl -X -v -d 'client_id=the_client&client_secret=secret&grant_type=client_credentials' -X POST "http://localhost:9090/oauth/token" 

을하지만 난

InsufficientAuthenticationException: There is no client authentication 

Principal은 (스프링 보안 코드) 여기 null 인에 의한 취득 ​​:

@FrameworkEndpoint 
@RequestMapping(value = "/oauth/token") 
public class TokenEndpoint extends AbstractEndpoint { 

    @RequestMapping 
    public ResponseEntity<OAuth2AccessToken> getAccessToken(Principal principal, 
      @RequestParam("grant_type") String grantType, @RequestParam Map<String, String> parameters) { 

     if (!(principal instanceof Authentication)) { 
      throw new InsufficientAuthenticationException(

그래서 나는 먼저 서버에 대해 인증을 받아야합니다. 하지만 그게 이고 내가하고 싶은게 아니라입니다. 내 서버 중 두 대가 공유 암호를 사용하여 서로 이야기하기를 원합니다. OAuth 공급자 서버는 클라이언트 서버가 해당 토큰을 사용하여 서버의 모든 REST 리소스에 액세스 할 수 있도록 요청시 (신뢰할 수있는) 클라이언트 서버에 액세스 토큰을 제공해야합니다. 이것은 외부 액세스로부터 REST 자원을 보호해야합니다.

나중에 제 3 자에게 선택한 리소스를 제공하고 결국 서버 간 통신을위한 좀 더 세분화 된 보안을 구현하려고합니다. 하지만 지금은 외부 액세스로부터 REST 서버를 보호해야합니다.

전체 클라이언트 자격 증명 흐름이나 스프링 보안 응용 프로그램에 대한 오해가있을 수 있으므로 명확한 설명을 부탁드립니다.

답변

18

인증 서버에 클라이언트를 인증하지 않았습니다.

당신은 같은 것을 할 필요가 : 이것은 grant_type 및 기타 매개 변수를 지정 후 인증 서버에 클라이언트를 인증하고있다

curl --user the_client:secret --data "grant_type=client_credentials" http://localhost:9090/oauth/token 

. 그러면 oauth 클라이언트 세부 정보에 의해 결정된 범위의 'bearer'유형의 액세스 토큰이 반환됩니다. 토큰을 받으면 인증 헤더를 설정하여 보호 된 리소스에 액세스 할 수 있습니다.

curl -H "Authorization: Bearer <accessToken>" <resourceUrl> 
+0

답장을 보내 주셔서 감사합니다. 내 사고 방식이 근본적으로 맞습니까? 클라이언트 자격 증명 흐름의 경우 클라이언트 자격 증명 및 유형 부여 토큰을 요청한 다음 해당 토큰을 사용하여 보호 된 리소스에 액세스합니까? Sparklr 예제 프로젝트를 사용하면 위에 언급 한 호출이 작동하기 때문에 설치 오류가 발생했다고 생각합니다. – Pete

+0

올바른 트랙에 있다고 생각합니다. 클라이언트는 먼저 특정 권한 유형을 사용하여 토큰을 요청합니다. 그런 다음 보호 된 리소스에 액세스 할 때 인증 헤더에 토큰 만 전달합니다. 리소스에 액세스하는 예를 사용하여 답변을 업데이트했습니다. – kldavis4