Twitter는 회원 인증과 OAuth 와 XAuth를 지원합니다.
사실 XAuth로 인증 하는것이 Mobile에서 보편화된 방법인데, XAuth는 ID/Password를 3rd-Party Application에서 입력 받기에,
개인적으로는 OAuth를 선호 합니다.
Twitter에서 OAuth는 oauth_verifier를 Pin Code라는 개념으로, 유저에게 HTML 화면으로 노출시키고, 그것을 입력하도록 하고 있습니다.
"휴대폰 인증번호" 쯤으로 생각하면 될듯합니다.
사용자에게 입력하게 한다. 사용자는 이미 아이디와 비밀번호를 입력했는 데 또 입력하게 해야 한다니,
별로 좋지 않군요.
오늘의 목표는 저 Pin Code값을 자동으로 가져오는 것입니다 !
그래서 HTML 을 Parsing해서 가져와보자고 생각을 했습니다.
Pin 값이 <div id="oauth_pin"> 으로 되어 있어서, HTML DOM Element Parsing으로 가져 올수 있을꺼 같다는 생각을 했습니다.
그러나..
Android WebView에 HTML 을 가져 오는게 존재 하지 않습니다 ;ㅂ;
그래서 WebView에 Javascript 를 집어 넣어서, Java Code를 호출 하여, dom의 값을 넣기로 했습니다.
class MyJavaScriptInterface
{
public void showHTML(String pin) throws TwitterException
{
if(pin.length() > 0 ) {
Log.i("Javascript Interface","pin = " + pin);
AccessToken accessToken = twitter.getOAuthAccessToken(requestToken, pin);
Log.i("Javascript Interface", "AccessToken = " + accessToken);
}
else {
Log.i("Javascript Interface","get pin failed...");
}
}
}
webview.addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT");
이런식으로 Java Code와 연결된, Javascript Interface를 WebView에 삽입 할수 있습니다.
view.loadUrl("javascript:window.HTMLOUT.showHTML(document.getElementById('oauth_pin').innerHTML);");
view.loadUrl("javascript:window.HTMLOUT.showHTML(document.getElementsByTagName('code')[0].innerHTML);");
WebViewClient의 onPageFinisehd() Method를 Override하여, 삽입한 Javascript를 실행해주면
Page가 로딩 될때마다, 호출되고,oauth_pin 값을 얻는 순간이 인증이 끝난 순간이됩니다.
그것을 통해서 AccessToken을 가져오면 Twitter OAuth 인증은 끝난 셈이죠.
Java Code내에서 끝나지 않고, Javascript 를 통한다는게 좀 마음에 안드는 방식이긴 합니다.
더 좋은 방법을 알게 되면 후딱 후딱 넘어가야죠. 어쨌든 잘 동작합니다.