Twitter4j 라이브러리 버그 리포팅 "401:Authentication credentials..."
트위터 웹 어플리케이션을 개발하면서 Twitter4j 라는 어플리케이션을 사용하고 있는데요. 오픈 라이브러리이다보니 자잘한 버그들이 많이 있습니다. 이번에 잡은 버그는 JSP로 서드파티 어플리케이션을 개발하면서 나왔던 버그입니다. 웹에 공개되어 있는 Twitter4j 라이브러리와 JSP 연동 예제를 따라하다보면 다음과 같은 에러 메시지가 뜨게 됩니다.
( 에러 메시지라고 할까요. 아니면 Exception이라고 할까요.)
401:Authentication credentials (https://dev.twitter.com/docs/auth) were missing or incorrect. Ensure that you have set valid conumer key/secret, access token/secret, and the system clock in in sync.
The screen name / password combination seems to be invalid.Relevant discussions can be on the Internet at:
http://www.google.co.jp/search?q=96430884 or
http://www.google.co.jp/search?q=00002d45
TwitterException{exceptionCode=[96430884-00002d45 9aae86e9-14926980], statusCode=401, retryAfter=-1, rateLimitStatus=null, featureSpecificRateLimitStatus=null, version=2.2.4}
The screen name / password combination seems to be invalid.Relevant discussions can be on the Internet at:
http://www.google.co.jp/search?q=96430884 or
http://www.google.co.jp/search?q=00002d45
TwitterException{exceptionCode=[96430884-00002d45 9aae86e9-14926980], statusCode=401, retryAfter=-1, rateLimitStatus=null, featureSpecificRateLimitStatus=null, version=2.2.4}
이 에러 메시지가 떠서 한참을 고생했었는데, AccessToken을 얻는 과정에서 뭔가 잘 못 되었나봅니다. 일단 Exception이 발생한 부분을 보면
if (token.equals(oauthToken)) {
try
{
{
accessToken = twitter.getOAuthAccessToken(oauthToken,requestToken.getTokenSecret());
}
catch (TwitterException e)
{
e.printStackTrace();
System.out.println("트위터인증실패 : " + e);
catch (TwitterException e)
{
e.printStackTrace();
System.out.println("트위터인증실패 : " + e);
}
dev.twitter.com 에서 지정해 놓은 리디렉션 URL에 추가되어 얻어진 oauthToken( 결국 requestToken.getToken()에서 얻어진 토큰 )과 requestToken.getTokenSecret() 으로 얻어진 Secret 을 이용해서 AceessToken을 얻어 이것을 이용해 OAuth 로그인을 한 계정의 정보에 접근을 하게 됩니다.
이 때, AccessToken을 얻는 과정에서 Exception이 발생하게 되는데, 왜 그런지는 모르겠지만 오버라이드 된 다른 메소드를 사용해서 해결했습니다.
해결 방법은...
a.jsp ( OAuth 로그인 이전 페이지... 여기서 OAuth 로그인 페이지로 넘어감 )
request.getSession().setAttribute("ReqToken",requestToken);
request.getSession().setAttribute("ReqToken",requestToken);
리퀘스트 토큰 자체를 세션에 저장합니다. ( 원래는 requestToken.getToken(), requestToken.getTokenSecret() 을 이용해서 토큰과 시크릿을 만들어서 세션에 저장했었죠. )
b.jsp ( OAuth 로그인 이후, 리디렉션 URL로 저장된 곳 )
RequestToken reqToken = (RequestToken)request.getSession().getAttribute("ReqToken");
...
accessToken = twitter.getOAuthAccessToken(reqToken);
RequestToken reqToken = (RequestToken)request.getSession().getAttribute("ReqToken");
...
accessToken = twitter.getOAuthAccessToken(reqToken);
이런식으로 세션에 RequestToken 객체를 저장했다가 다시 꺼내와서 RequestToken 으로 캐스팅해서 AccessToken을 얻는 방식을 사용하면 됩니다.
다른 해결 방법이 있는지는 모르겠지만 저는 이런식으로 Twitter4j 라이브러리가 던지는 Exception을 해결 했습니다.