Java/JSP에서 /oauth/token API를 호출하여 access token 얻는 방법

REST API의 로그인 Protocol을 준수하면 어떤 language, platform에서도 authorization code 및 access token을 얻을 수 있습니다.

다음은 Java 의 http관련 client들을 통해 access token을 얻는 간단한 예시입니다.

- HttpsURLConnection(HttpURLConnection) 이용한 방법.

    final String AUTH_HOST = "https://kauth.kakao.com";
    final String tokenRequestUrl = AUTH_HOST + "/oauth/token";

    String CLIENT_ID = "[REST API Key]"; // 해당 앱의 REST API KEY 정보. 개발자 웹사이트의 대쉬보드에서 확인 가능
    String REDIRECT_URI = "[Redirect uri]"; // 해당 앱의 설정된 uri. 개발자 웹사이트의 대쉬보드에서 확인 및 설정 가능
    String code = "[Authorized code]"; // 로그인 과정중 얻은 authorization code 값

    HttpsURLConnection conn = null;
    OutputStreamWriter writer = null;
    BufferedReader reader = null;
    InputStreamReader isr= null;

    try {
      final String params = String.format("grant_type=authorization_code&client_id=%s&redirect_uri=%s&code=%s",
                        CLIENT_ID, REDIRECT_URI, code);

      final URL url = new URL(tokenRequestUrl);

      conn = (HttpsURLConnection) url.openConnection();
      conn.setRequestMethod("POST");
      conn.setDoOutput(true);

      writer = new OutputStreamWriter(conn.getOutputStream());
      writer.write(params);
      writer.flush();
   
      final int responseCode = conn.getResponseCode();
      System.out.println("\nSending 'POST' request to URL : " + tokenRequestUrl);
      System.out.println("Post parameters : " + params);
      System.out.println("Response Code : " + responseCode);

      isr = new InputStreamReader(conn.getInputStream());
      reader = new BufferedReader(isr);
      final StringBuffer buffer = new StringBuffer();
      String line;
      while ((line = reader.readLine()) != null) {
        buffer.append(line);
      }
     
      System.out.println(buffer.toString());

    } catch (IOException e) {
      e.printStackTrace();
    } finally {
        // clear resources
        if (writer != null) {
          try {
              writer.close();
           } catch(Exception ignore) {
           }
        }
        if (reader != null) {
          try {
              reader.close();
          } catch(Exception ignore) {
          }
        }
        if (isr != null) {
            try {
                isr.close();
            } catch(Exception ignore) {
            }
         }
    }

- Apache HttpClient 라이브러리를 이용한 방법.

    final String AUTH_HOST = "https://kauth.kakao.com";
    final String tokenRequestUrl = AUTH_HOST + "/oauth/token";

    String CLIENT_ID = "[REST API Key]"; // 해당 앱의 REST API KEY 정보. 개발자 웹사이트의 대쉬보드에서 확인 가능
    String REDIRECT_URI = "[Redirect uri]"; // 해당 앱의 설정된 uri. 개발자 웹사이트의 대쉬보드에서 확인 및 설정 가능
    String code = "[Authorize code]"; // 로그인 과정중 얻은 authorization code 값

    final List<NameValuePair> postParams = new ArrayList<NameValuePair>();
    postParams.add(new BasicNameValuePair("grant_type", "authorization_code"));
    postParams.add(new BasicNameValuePair("client_id", CLIENT_ID));
    postParams.add(new BasicNameValuePair("redirect_uri", REDIRECT_URI));
    postParams.add(new BasicNameValuePair("code", code));

    final HttpClient client = HttpClientBuilder.create().build();

    final HttpPost post = new HttpPost(tokenRequestUrl);

    // add header
    //post.setHeader("", "");

    BufferedReader rd = null;
    InputStreamReader isr = null;
    try {
      post.setEntity(new UrlEncodedFormEntity(postParams));

      final HttpResponse response = client.execute(post);

      final int responseCode = response.getStatusLine().getStatusCode();

      System.out.println("\nSending 'POST' request to URL : " + tokenRequestUrl);
      System.out.println("Post parameters : " + postParams);
      System.out.println("Response Code : " + responseCode);
      
      isr = new InputStreamReader(response.getEntity().getContent());
      rd = new BufferedReader(isr);

      final StringBuffer buffer = new StringBuffer();
      String line;
      while ((line = rd.readLine()) != null) {
        buffer.append(line);
      }

      System.out.println(buffer.toString());

    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
    } catch (ClientProtocolException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
        // clear resources
        if (rd != null) {
            try {
                rd.close();
            } catch(Exception ignore) {
            }
        }
        if (isr != null) {
            try {
                isr.close();
            } catch(Exception ignore) {
            }
         }
    }

조금 더 간단히 개발하려면 그냥 호출 url 을 redirect 하면 됩니다.