트위터에서 Basic인증방식(ID와 Password를 직접입력 받는 방식)을 6월 까지만 지원한다는 소식이 있어서
트위터 어플 만드시는 분들이 oauth인증 방식에 대하여 많이 궁금해 히시는 것 같습니다.
twitter4j를 이용한 oauth인증방법에 대하여 간단하게 공유 하도록 하겠습니다.
- Web application Oauth인증
Web application의 경우는 requestToken을 요청할 때 등록된 callback Url로 넘어온 인증키(oauth_verifier)을 이용하여서 AccessToken을 발급받은 후 twitter에 인증하는 방식 입니다.
Client application의 경우는 requestToken을 요청할 때 따로 callback url을 등록하지 않고 인증 Url로 web browser를 실행한 후 app 사용자가 로그인하여 발급 받은 PIN번호를 입력 받아서 AccessToken을 발급받은 후 twitter에 인증하는 방식 입니다.
- oauth인증 방식에 자세한 정보는 아래 링크를 참고하세요
http://cafe.naver.com/openapi.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=1595
- twitter4j는 2.1 이상의 버전부터 Oauth인증 방식을 지원하고 있습니다.
twitter4j를 이용하여 Web application oauth인증방식을 구현하는 방법에 대하여 설명하겠습니다.
1. TwitterMain.java
public static String consumerKey = ""; //"발급받은consumerKey "; public static String consumerSecret = ""; //"발급받은consumeSecret"; public static Uri CALLBACK_URL = Uri.parse("wefu://twitter"); private Twitter twitter; private AccessToken acToken; private RequestToken rqToken; private Status status = null; public void onCreate(Bundle savedInstanceState) { twitter = new TwitterFactory().getInstance(); twitter.setOAuthConsumer(consumerKey, consumerSecret); rqToken = twitter.getOAuthRequestToken(CALLBACK_URL.toString()); startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse( rqToken.getAuthorizationURL()))); } protected void onNewIntent(Intent intent) { super.onNewIntent(intent); Uri uri = intent.getData(); if(uri != null && CALLBACK_URL.getScheme().equals(uri.getScheme())){ String oauth_verifier = uri.getQueryParameter("oauth_verifier"); try { acToken = twitter.getOAuthAccessToken(rqToken, oauth_verifier); status = twitter.updateStatus("test twitter4j web application oauth"); } catch (TwitterException e) { Log.e(TAG, e.getMessage()); } }}
1.1 RequestToken을 요청할때 callback URL을 지정하여서 요청합니다.
1.2 Browser를 응답받은 RequestToken의 getAuthorizationURL로 지정하여서 실행 합니다.
1.3 onNewIntent에서 callback URL로 리다이렉트 될때 인증 data를 받아서 AccessToken을 요청하여 인증합니다.
2. AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".TwitterMain" android:label="@string/app_name" android:launchMode="singleInstance" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="wefu" android:host="twitter" /> </intent-filter> </activity></application>
2.1 intent-filter에 data로 callback URL를 지정해 주게 되면 TwitterMain activty가 다시 실행되게 되므로 launchMode를
singleInstance로 지정합니다
- 추가로 xauth인증 방식에 대하여 설명한 블로그가 있어 링크합니다
http://blog.naver.com/pppplqqqq?Redirect=Log&logNo=100105293098
프로그램이 올라갔을때 실행이 안됩니다. ㅡ나름 잘 붙였다고 생각했지만;;
구글 코드 프로젝트에서 가져온 예제도 잘안되는게 ㅡ 제가 실수를 하나봐요^^;;
궁금한게 있는데 컨슈머키와 시크릿을 발급받을때 URL적는칸은 아무렇게나 적어도 되나요?
그리고 위 예제를 실행하는데 발급시 적는 Application Name과 상관이 있는지 알고싶습니다^^:;
ㅡ 컨슈머키를 발급받을때 웹브라우저형으로 받아야하나요?!그렇다면 발급받을때 적는 CallBackUri칸에 무엇을 적어야하나요?ㅠ
requsetToken에서 계속 Null값이 들어가네요 ㅠㅠ
토큰을 계속 못받는것 같아요 ㅠㅠ
"wefu"
android:host=
"twitter"
/>
여기서 scheme 부분은 제가 트위터/apps에 작성한 어플이름을 적는곳이 맞나요?ㅎ
여전히 글작성부분은 프로그램이 종료가 됩니디ㅏ .ㅠㅠ
실제로 메세지가 안찍히는 것 같아요..
그런가요? ?
Uri uri = intent.getData();
의 uri값을 확인해보려고 해도 안찍히네요..
도와주세요~
'')위분들은 위의 소스 잘실행되시나요?ㅠ 혹 저만 그런듯 해서요 ㅠ글써주신분께는 정말 감사드리고 있습니다.
말이죠;;
현재 Xauth방식은 제공안된다고 하네요... 저두 잘 실행이 안되어서 <uses-permission android:name = "android.permission.INTERNET" /> androidManifest.xml에 추가해주었더니 잘 돌아갑니다. 큰도움 받았습니다. ^^
소스 완전 감사하게 참고 잘 했습니다 ^^ 근데 질문이 있는데 callback URL 이 어떠한 형식이 존재하거나 해야 하나요?
아무거나 써넣어도 되는지 알고 yyy://homepage 라고 했는데 안되는거 보니깐 어떤 조건이 필요한 페이지가 들어가야 할 것 같아서요.
^^~ 참 그리고 인증 후에 액티비티가 돌아오고나서 안드로이드에서 뒤로가기 버튼?? 을 누르면 다시 인증 웹페이지로 돌아가던데
그건 어떻게 막을 방법이 없을까요??
소스를 긁어서 실행했더니 실패하네요 ^^
컨슈머키와 시크릿은 채워서 실행해봤습니다 .ㅠ
어떤 식으로 수정해야할지 팁좀 알려주세요 ㅠㅠ