뤼준석
60
2015-10-01 11:01:53
7
3768

Tistory OAuth 2.0 API 질문입니다. 고객센터가 너무 엉망이라서 ㅜㅜ


1. 인증가이드에 보면 Authorization Code Grant Flow 와 Implicit Grant Flow 만 나와있습니다만 이 2가지 방식만 지원하는 것일까요? 참고로 OAuth 표준에는 4가지 방식(+ Client Credentials Flow, Resource Owner Password Grant Flow)을 지원한다고 나와있습니다.

배치에서 구동해야 하기때문에 위 2가지 방식은 브라우저 기반이라서 적합하지 않을 것 같아서 여쭙습니다.

2. Google Login 예제를 통해서 HttpsURLConnection 을 이용해 로그인에 성공했는데..

같은 방식으로 티스토리는 적요이 안되더군요 ㅠㅠ.  Authorization Code Grant Flow 와 Implicit Grant Flow

사용하려면 웹상에서 동작하는것이라 로그인 과정이 필수인데.. Htmlunit을 사용하자니 상식적으로 말이 안되는것 같아서요.

혹시 Http post 방식으로 파라미터 던져서 Tistory Login 구현해보신분 계신가요? 있다면 방식을 자세히 알려주시면 고맙겠습니다.

혹시 몰라서 작동이 되지않는 관련 소스코드 첨부합니다.


package com.lee;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.CookieHandler;
import java.net.CookieManager;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

import javax.net.ssl.HttpsURLConnection;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class HttpUrlConnectionExample {

	private List<String> cookies;
	private HttpsURLConnection httpsConn;
	private HttpURLConnection httpConn;

	private final String USER_AGENT = "Mozilla/5.0";

	public static void main(String[] args) throws Exception {

		String loginFormUrl = "http://www.tistory.com";
		String postUrl = "https://www.tistory.com/auth/login";
		String manageList = "http://www.tistory.com";

		HttpUrlConnectionExample http = new HttpUrlConnectionExample();

		// make sure cookies is turn on
		CookieHandler.setDefault(new CookieManager());

		// 1. Send a "GET" request, so that you can extract the form's data.
		String page = http.GetPageContent(loginFormUrl);
		System.out.println(page);
		String postParams = http.getFormParams(page, "저의 아이디", "저의 패스워드");

		// 2. Construct above post's content and then send a POST request for
		// authentication
		http.sendPost(postUrl, postParams);

		// 3. success then go to magameList.
		String result = http.GetPageContent(manageList);
		System.out.println(result);
	}

	private void sendPost(String url, String postParams) throws Exception {

		URL obj = new URL(url);
		httpsConn = (HttpsURLConnection) obj.openConnection();

		// Acts like a browser
		httpsConn.setUseCaches(false);
		httpsConn.setRequestMethod("POST");
		httpsConn.setRequestProperty("Host", "accounts.google.com");
		httpsConn.setRequestProperty("User-Agent", USER_AGENT);
		httpsConn.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
		httpsConn.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
		for (String cookie : this.cookies) {
			httpsConn.addRequestProperty("Cookie", cookie.split(";", 1)[0]);
		}
		httpsConn.setRequestProperty("Connection", "keep-alive");
		httpsConn.setRequestProperty("Referer", "https://accounts.google.com/ServiceLoginAuth");
		httpsConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
		httpsConn.setRequestProperty("Content-Length", Integer.toString(postParams.length()));

		httpsConn.setDoOutput(true);
		httpsConn.setDoInput(true);

		// Send post request
		DataOutputStream wr = new DataOutputStream(httpsConn.getOutputStream());
		wr.writeBytes(postParams);
		wr.flush();
		wr.close();

		int responseCode = httpsConn.getResponseCode();
		System.out.println("\nSending 'POST' request to URL : " + url);
		System.out.println("Post parameters : " + postParams);
		System.out.println("Response Code : " + responseCode);

		BufferedReader in = new BufferedReader(new InputStreamReader(httpsConn.getInputStream()));
		String inputLine;
		StringBuffer response = new StringBuffer();

		while ((inputLine = in.readLine()) != null) {
			response.append(inputLine);
		}
		in.close();
		System.out.println(response.toString());

	}

	private String GetPageContent(String url) throws Exception {

		URL obj = new URL(url);
		httpConn = (HttpURLConnection) obj.openConnection();

		// default is GET
		httpConn.setRequestMethod("GET");

		httpConn.setUseCaches(false);

		// act like a browser
		httpConn.setRequestProperty("User-Agent", USER_AGENT);
		httpConn.setRequestProperty("Accept",
				"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
		// httpConn.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
		if (cookies != null) {
			for (String cookie : this.cookies) {
				httpConn.addRequestProperty("Cookie", cookie.split(";", 1)[0]);
				System.out.println(cookie.split(";", 1)[0]);
			}
		}
		int responseCode = httpConn.getResponseCode();
		System.out.println("\nSending 'GET' request to URL : " + url);
		System.out.println("Response Code : " + responseCode);

		BufferedReader in = new BufferedReader(new InputStreamReader(httpConn.getInputStream()));
		String inputLine;
		StringBuffer response = new StringBuffer();

		while ((inputLine = in.readLine()) != null) {
			response.append(inputLine);
		}
		in.close();

		// Get the response cookies
		setCookies(httpConn.getHeaderFields().get("Set-Cookie"));
		
		System.out.println(httpConn.getHeaderFields().get("Set-Cookie").toString());

		return response.toString();

	}

	public String getFormParams(String html, String username, String password) throws UnsupportedEncodingException {

		System.out.println("Extracting form's data...");

		Document doc = Jsoup.parse(html);

		// Google form id
		Element loginform = doc.getElementById("mainLoginForm");
		Elements inputElements = loginform.getElementsByTag("input");
		List<String> paramList = new ArrayList<String>();
		for (Element inputElement : inputElements) {
			String key = inputElement.attr("name");
			String value = inputElement.attr("value");

			if (key.equals("loginId"))
				value = username;
			else if (key.equals("password"))
				value = password;
			else if (key.equals("rememberLoginId"))
				continue;
			paramList.add(key + "=" + URLEncoder.encode(value, "UTF-8"));
		}

		// build parameters list
		StringBuilder result = new StringBuilder();
		for (String param : paramList) {
			if (result.length() == 0) {
				result.append(param);
			} else {
				result.append("&" + param);
			}
		}

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

		return result.toString();
	}

	public List<String> getCookies() {
		return cookies;
	}

	public void setCookies(List<String> cookies) {
		this.cookies = cookies;
	}

}


0
0
  • 답변 7

  • 뤼준석
    60
    2015-10-01 11:02:36
    추가 질문.. 저 쿠키 부분을 찍어도 TIMELEVEL  어쩌구 자꾸 똑같은 값만 나오는데.. 혹시 저부분 때문이 아닐런지 말씀드려봅니다..ㅜㅜ
    0
  • vichara
    289
    2015-10-01 11:21:58

    Scribe쓰세요

    인증 글쓰기 리스트 메뉴얼대로 하면 다됩니다

    0
  • 뤼준석
    60
    2015-10-01 11:27:11

    scribe 에 인증 기능까지 포함인가요??


    auth code 받아올때 티스토리의 경우 앱승인 허가하기 페이지가 계속 뜹니다만..


    혹시 죄송합니다만


    Tistory 쪽


    구현해보셨나요 FaceBook 이나 Google은 이미 Scribe로 되는거 알고 있습니다

    0
  • vichara
    289
    2015-10-01 11:31:47

    저는 인증은 매번받아오는거 만들기 귀찮고

    어차피 동적으로 인증받을필요 없어서 엑세스토큰 저장하고 그냥 프로퍼티로 빼놓고 쓰고있습니다 액세스토큰은 브라우저로 받으셔도되요

    Oauthrquest쓰면되고요 파라미터는 addbodyparameter쓰면되요

    0
  • vichara
    289
    2015-10-01 11:33:24

    인증까지 포함이고 디컴파일러로 뜯어보면

    그냥 url이랑 파라미터 키를 셋팅해놓은것들이에요(구글 페북 등

    그걸 직접 url이랑 파라미터 셋팅하고 센드하면 똑같아요 

    폰이라 이거뭐 쓰기 힘드네요

    0
  • 뤼준석
    60
    2015-10-01 11:36:54

    다시 한번 시도해보겠습니다. ㅠㅠ 제가 아마 잘못 구현했던 거겠죠.

    0
  • juuu
    4
    2015-11-30 09:16:17

    안녕하세요.. 구글 자동로그인 기능 구글링하다가 해당 글 보게되었는데요

    Google Login 예제를 통해서 HttpsURLConnection 을 이용해 로그인에 성공 하셨다고하셨는데..

    저도 mykyong 이분꺼 참고해서 해봤는데

    접근은 되는데 로그인처리가 안되던데..어떻게하셨는지 알수있을까요

    제 메일 계정은 woohyun2u@naver.com인데.. 답변 부탁 드리겠습니다..

    감사합니다

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.