반응형
앞에 글(2018/08/07 - [Development/Tech&Seminar] - #1 Open ID Connect 가 뭐야???에서 OpenID Connect가 무엇인지에 대해서 설명을 했었다. 이번에는 각가의 흐름에 대해서 좀더 자세히 설명을 해보기로 한다. 

OpenID Connect 의 Flow 는 response_type 에 의해서 정해진다고 말했었다. 그 response_type 에 따라서 어떻게 다른지 확인해보자.

아래 정의한 모든 Request는 parameter  scope  openid 가 포함되어야 한다. openid가 포함되어있지 않을 경우는 다르게 동작할 수 있다. 

1. response_type = code

Endpoint

Authorization Code

Access Token

ID Token

Authorization

O

X

X

Token

X

O

O


openid  포함되지 않을경우 (oauth authorization code flow  동일하다)


Endpoint

Authorization Code

Access Token

ID Token

Authorization

O

X

X

Token

X

O

X

 

    2. response_type = id_token (Token Endpoint 를 사용하지 않는다.)

    Endpoint

    Authorization Code

    Access Token

    ID Token

    Authorization

    X

    X

    O

     

    3. response_type = id_token token (Token Endpoint 를 사용하지 않는다.)


      Endpoint

      Authorization Code

      Access Token

      ID Token

      Authorization

      X

      O

      O


      추가적으로 Oauth 2.0 에서는 response_type 에 token 이 라는 항목도 있지만 OpenID Connect 에서는 사용하지 않는다. response_type 이 token 일 경우에는 ID-Token을 리턴하지 않기 때문이다. 

      4. response_type = code id_token

      Endpoint

      Authorization Code

      Access Token

      ID Token

      Authorization

      O

      X

      O

      Token

      X

      O

      O


      5. response_type = code token

      Endpoint

      Authorization Code

      Access Token

      ID Token

      Authorization

      O

      O

      X

      Token

      X

      O

      O


      openid  포함되지 않을경우 (oauth authorization code flow  동일하다)


      Endpoint

      Authorization Code

      Access Token

      ID Token

      Authorization

      O

      O

      X

      Token

      X

      O

      X


      6. response_type = code id_token token

      Endpoint

      Authorization Code

      Access Token

      ID Token

      Authorization

      O

      O

      X

      Token

      X

      O

      O




      참고자료

      http://openid.net/specs/openid-connect-core-1_0.html#IDToken

      https://medium.com/@darutk/diagrams-of-all-the-openid-connect-flows-6968e3990660


      728x90
      반응형
      반응형

      공부하면서 만든 Oauth Server에 대한 테스트를 Postman으로는 했는데 실제로 Client Code가 필요하게 되었다. 


      2017/09/04 - [Development/Java] - [Spring Boot]Oauth server 적용해보기


      테스트만 할 경우에는 Postman만 써도 상관이 없지만 실제 Client 가 호출을 하려면 code가 필요하다. 그래서 여기저기 구글링을 해가면서 찾아봤다. 


      우선 Oauth Token을 발급 받기위한 코드가 필요하다. 


      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      public String getOAuth2Token(String username, String password) {
              final String CLIENT_ID = "myclient";
              final String CLIENT_SECRET = "secret";
              final String GRANT_TYPE = "password";
              final String SERVER_URL = "http://localhost:" + port;
              final String API_OAUTH_TOKEN = "/oauth/token";
       
              String clientCredentials = CLIENT_ID + ":" + CLIENT_SECRET;
              String base64ClientCredentials = new String(Base64.encodeBase64(clientCredentials.getBytes()));
       
              HttpHeaders headers = new HttpHeaders();
              headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
              headers.add("Authorization""Basic " + base64ClientCredentials);
       
              MultiValueMap<StringString> parameters = new LinkedMultiValueMap<>();
              parameters.add("grant_type", GRANT_TYPE);
              parameters.add("username", username);
              parameters.add("password", password);
       
              HttpEntity<MultiValueMap<StringString>> request = new HttpEntity<>(parameters, headers);
       
              @SuppressWarnings("rawtypes")
              ResponseEntity<Map> response;
       
              URI uri = URI.create(SERVER_URL + API_OAUTH_TOKEN);
              response = restTemplate.postForEntity(uri, request, Map.class);
              return  (String) response.getBody().get("access_token");
          }
      cs


      위에 작성된 메소드를 보면 파라메터로 id, password를 받게 되어있다. 이건 실제 사용자의 id, password를 넣으면 된다. 그리고 그 이외에 필요한 정보들은 final 상수로 정의를 해놓았다. 다만 Testcase로 작성 하다 보니 port 는 Random하게 들어간다. 호출 형태는 Postman에서 작성했던 것을 그대로 Code로 옮긴걸로 생가하면 된다.  저렇게 호출을 하게되면 결과값으로 access_token값을 받게된다.


      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      @Test
      public void getOAuth2TokenTest(){
          Assert.assertNotNull(accessToken);
      }
       
      @Test
      public void getTestWithAccessToken(){
          final String SERVER_URL = "http://localhost:" + port;
          final String API_URL = "/private?access_token={access_token}";
       
          ResponseEntity<String> responseEntity = restTemplate.getForEntity(
                  SERVER_URL + API_URL,
                  String.class,
                  accessToken);
       
          Assert.assertEquals("private", responseEntity.getBody());
      }
      cs


      이렇게 받은 access_token을 실제 API 에 넣어서 보내주면 전에 글에서 postman  으로 실행했던 것과 동일한 결과를 얻을 수 있다.

      위에 작성된 소스 코드는 https://github.com/blusky10/study_spring 에 가서 OauthServiceTest.java파일을 보면 확인 할 수 있다.


      728x90
      반응형

      + Recent posts