2010-01-13 3 views
2

GAE/J에서 Twitter4J API를 사용하고 있습니다.사용자 새로 고침 페이지를 다시 사용할 때 OAuth 요청 토큰 재사용 - Twitter4j on GAE

사용자가 내 페이지를 방문했을 때 요청 토큰을 사용하고 싶습니다. (back URL이라고 함). 그리고 새로 고침 버튼을 누릅니다. 나는 그 다음 코드를 작성한다. 하지만 사용자가 새로 고침 버튼을 누르면. 인증 자격 증명 오류가 있습니다. 보류를 참조하십시오. 사용자가 처음으로 해당 토큰을 사용한 경우 제대로 작동합니다.

HomeServlet.java 코드 :

HttpSession session = request.getSession(); 

      twitter.setOAuthConsumer(FFConstants.CONSUMER_KEY, 
        FFConstants.CONSUMER_SECRET); 
      String token = (String) session.getAttribute("token"); 
      String authorizedToken = (String)session.getAttribute("authorizedToken"); 

      User user = null; 
      if (!token.equals(authorizedToken)){ 
       AccessToken accessToken = twitter.getOAuthAccessToken(
         token, (String) session 
           .getAttribute("tokenSecret")); 
       twitter.setOAuthAccessToken(accessToken); 
       user = twitter.verifyCredentials(); 
       session.setAttribute("authorizedToken", token); 
       session.setAttribute("user", user); 
      }else{ 
       user = (User)session.getAttribute("user"); 
      } 

      TwitterUser twitterUser = new TwitterUser(); 
      twitterUser.setFollowersCount(user.getFollowersCount()); 
      twitterUser.setFriendsCount(user.getFriendsCount()); 
      twitterUser.setFullName(user.getName()); 
      twitterUser.setScreenName(user.getScreenName()); 
      twitterUser.setLocation(user.getLocation()); 

내가 그렇게 할 수있는 방법을 제안 해주십시오. 나는 많은 웹 사이트에서 보았다. 사용자는 동일한 토큰으로 사용자를 보유합니다. 사용자가 브라우저 새로 고침 단추를 반복해서 눌러도.

도와주세요.

예외 스택 트레이스는 :

Reason: twitter4j.TwitterException: 401:Authentication credentials were missing or incorrect. /friends/ids.xml This method requires authentication. 
at twitter4j.http.HttpClient.httpRequest(HttpClient.java:469) 
at twitter4j.http.HttpClient.get(HttpClient.java:412) at twitter4j.Twitter.get(Twitter.java:276) 
at twitter4j.Twitter.get(Twitter.java:228) at twitter4j.Twitter.getFriendsIDs(Twitter.java:1819) 
at com.tff.servlet.HomeServlet.doGet(HomeServlet.java:86) at javax.servlet.http.HttpServlet.service(HttpServlet.java:693) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:806) 
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1093) at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:97) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084) at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084) at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084) at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360) at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712) at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405) at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:238) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139) at org.mortbay.jetty.Server.handle(Server.java:313) at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:506) at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:830) at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76) at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:381) at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:135) at com.google.apphosting.runtime.JavaRuntime.handleRequest(JavaRuntime.java:235) at com.google.apphosting.base.RuntimePb$EvaluationRuntime$6.handleBlockingRequest(RuntimePb.java:5235) at com.google.apphosting.base.RuntimePb$EvaluationRuntime$6.handleBlockingRequest(RuntimePb.java:5233) at com.google.net.rpc.impl.BlockingApplicationHandler.handleRequest(BlockingApplicationHandler.java:24) at com.google.net.rpc.impl.RpcUtil.runRpcInApplication(RpcUtil.java:363) at com.google.net.rpc.impl.Server$2.run(Server.java:838) at com.google.tracing.LocalTraceSpanRunnable.run(LocalTraceSpanRunnable.java:56) at com.google.tracing.LocalTraceSpanBuilder.internalContinueSpan(LocalTraceSpanBuilder.java:536) at com.google.net.rpc.impl.Server.startRpc(Server.java:793) at com.google.net.rpc.impl.Server.processRequest(Server.java:368) at com.google.net.rpc.impl.ServerConnection.messageReceived(ServerConnection.java:448) at com.google.net.rpc.impl.RpcConnection.parseMessages(RpcConnection.java:319) at com.google.net.rpc.impl.RpcConnection.dataReceived(RpcConnection.java:290) at com.google.net.async.Connection.handleReadEvent(Connection.java:466) at com.google.net.async.EventDispatcher.processNetworkEvents(EventDispatcher.java:759) at com.google.net.async.EventDispatcher.internalLoop(EventDispatcher.java:205) at com.google.net.async.EventDispatcher.loop(EventDispatcher.java:101) at com.google.net.rpc.RpcService.runUntilServerShutdown(RpcService.java:251) at com.google.apphosting.runtime.JavaRuntime$RpcRunnable.run(JavaRuntime.java:394) at java.lang.Thread.run(Unknown Source) 

답변

1

나는이 문제를 확인했다.

사용자의 트위터 정보를 얻으려면 다시 요청 토큰을 사용하고있었습니다. 그건 잘못된 것입니다. 대신 액세스 토큰을 사용해야합니다. 나는 그것에 블로그 게시물을 작성했습니다 here.

관련 문제