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 를 통한다는게 좀 마음에 안드는 방식이긴 합니다. 
더 좋은 방법을 알게 되면 후딱 후딱 넘어가야죠. 어쨌든 잘 동작합니다. 


  1. musart 2011.01.17 00:25

    매우 좋은 아이디어입니다. 잘 활용하겠습니다.

    • taehoon.Koo 2011.01.17 16:30 신고

      사실 마음에 드는 구현은 아니지만 ;ㅂ; 이래저래 쓰고 있습니다 ㅎ

  2. croute 2011.02.05 18:36 신고

    좋은 방법이군요 ㅋ

  3. 딸꾹 2011.06.23 17:49

    음.. 제가 뭔가 잘못한 건가요?

    'oauth_pin'을 얻어오면 아래가 통째로 오는데요.
    원래 그런건가요? 그 값을 그냥 넣어도 진행이 되는거구요..?
    getOAuthAccessToken 호출하면 exception이 떠서..

    <div id="oauth_pin">
    <p>
    <span id="code-desc">이제 앱으로 돌아가 다음의 PIN을 입력하면 승인 절차가 완료됩니다:</span>
    <kbd aria-labelledby="code-desc"><code>9802935</code></kbd>
    </p>
    </div>

  4. 딸꾹 2011.06.23 18:14

    우선은 <code></code>로 짤라서 안을 사용했는데요 맞는지 모르겠네요.. ㅎ
    혹시 정보 아시면 도와주세요~ ㅋ

    • taehoon.Koo 2011.07.05 07:34 신고

      Twitter Html 형식이 변경되었네요.
      이래서 이런 꽁수는 안좋은것 같아요 ㅎㅎ

      javascript code 변경하면 됩니다.
      본문 수정해두었습니다 ~

+ Recent posts