2015-02-23 49 views
0

我正在嘗試使用fitbit4j爲fitbit創建應用程序。我發現他們的示例代碼 在 https://github.com/apakulov/fitbit4j/blob/master/fitbit4j-example-client/src/main/java/com/fitbit/web/FitbitApiAuthExampleServlet.java嘗試完成授權時無法識別的臨時令牌:FITBIT4J

當我試圖實現它時,我收到很多錯誤。下面 是他們的doGet()函數

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { 
    FitbitAPIClientService<FitbitApiClientAgent> apiClientService = new FitbitAPIClientService<FitbitApiClientAgent>(
      new FitbitApiClientAgent(apiBaseUrl, fitbitSiteBaseUrl, credentialsCache), 
      clientConsumerKey, 
      clientSecret, 
      credentialsCache, 
      entityCache, 
      subscriptionStore 
    ); 
    if (request.getParameter("completeAuthorization") != null) { 
     String tempTokenReceived = request.getParameter(OAUTH_TOKEN); 
     String tempTokenVerifier = request.getParameter(OAUTH_VERIFIER); 
     APIResourceCredentials resourceCredentials = apiClientService.getResourceCredentialsByTempToken(tempTokenReceived); 

     if (resourceCredentials == null) { 
      throw new ServletException("Unrecognized temporary token when attempting to complete authorization: " + tempTokenReceived); 
     } 
     // Get token credentials only if necessary: 
     if (!resourceCredentials.isAuthorized()) { 
      // The verifier is required in the request to get token credentials: 
      resourceCredentials.setTempTokenVerifier(tempTokenVerifier); 
      try { 
       // Get token credentials for user: 
       apiClientService.getTokenCredentials(new LocalUserDetail(resourceCredentials.getLocalUserId())); 
      } catch (FitbitAPIException e) { 
       throw new ServletException("Unable to finish authorization with Fitbit.", e); 
      } 
     } 
     try { 
      UserInfo userInfo = apiClientService.getClient().getUserInfo(new LocalUserDetail(resourceCredentials.getLocalUserId())); 
      request.setAttribute("userInfo", userInfo); 
      request.getRequestDispatcher("/fitbitApiAuthExample.jsp").forward(request, response); 
     } catch (FitbitAPIException e) { 
      throw new ServletException("Exception during getting user info", e); 
     } 
    } else { 
     try { 
      response.sendRedirect(apiClientService.getResourceOwnerAuthorizationURL(new LocalUserDetail("-"), exampleBaseUrl + "/fitbitApiAuthExample?completeAuthorization=")); 
     } catch (FitbitAPIException e) { 
      throw new ServletException("Exception during performing authorization", e); 
     } 
    } 
} 

當我運行它進入了 '其他' 部分首先代碼和我得到 的URL 本地主機:8080/fitbitApiAuthExample completeAuthorization = &的oauth_token = 5bccadXXXXXXXXXXXXXXXXXXXXXXXXXX & oauth_verifier = h35kXXXXXXXXXXXXXXXXX,我也得到了fitbit登錄屏幕,當我登錄 和自 'completeAuthorization == NULL'

我t再次執行else部分。所以我手動添加一個值,以便它將進入'if'部分。 因此,新的URL成爲 本地主機:8080/fitbitApiAuthExample completeAuthorization =成功&的oauth_token = 5bccadXXXXXXXXXXXXXXXXXXXXXXXXXX & oauth_verifier = h35kXXXXXXXXXXXXXXXXX,進入了 '如果' 部分。

現在是越來越異常 「試圖完成授權時無法識別的臨時令牌:」我試過很多解決方法,但仍然無法理解的錯誤。

請幫忙。

回答

0
public class NewServlet extends HttpServlet { 

    public String apiBaseUrl = "api.fitbit.com"; 
    public String webBaseUrl = "https://www.fitbit.com"; 
    public String consumerKey = "your key"; 
    public String consumerSecret = "your secret"; 
    public String callbackUrl = "*****/run?Controller=Verifier"; 
    public FitbitAPIClientService<FitbitApiClientAgent> apiClientService = null; 
    public String oauth_token = null; 
    public String oauth_verifier = null; 
    public String token = null; 
    public String tokenSecret = null; 
    public String userId = null; 
    public APIResourceCredentials resourceCredentials=null; 
    public FitbitApiClientAgent agent =null; 
    public LocalUserDetail user=null; 
    public Gson gson =null; 
    public UserInfo userInfo=null; 



    private static Properties getParameters(String url) { 
     Properties params = new Properties(); 
     String query_string = url.substring(url.indexOf('?') + 1); 
     String[] pairs = query_string.split("&"); 
     for (String pair : pairs) { 
      String[] kv = pair.split("="); 
      params.setProperty(kv[0], kv[1]); 
     } 
     return params; 
    } 

    protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException, ParserConfigurationException, SAXException, Exception { 
     PrintWriter out = response.getWriter(); 
response.addHeader("Access-Control-Allow-Origin", "*"); 

     // out.println(" ----- process Request Called-----"); 
     String controllerValue = request.getParameter("Controller"); 
     // out.println(" Controller Request : "+param); 

     if (controllerValue == null) { 
      // out.println(" inside if part "); 
      FitbitAPIEntityCache entityCache = new FitbitApiEntityCacheMapImpl(); 
      FitbitApiCredentialsCache credentialsCache = new FitbitApiCredentialsCacheMapImpl(); 
      FitbitApiSubscriptionStorage subscriptionStore = new FitbitApiSubscriptionStorageInMemoryImpl(); 
      FitbitApiClientAgent apiClientAgent = new FitbitApiClientAgent(apiBaseUrl, webBaseUrl, credentialsCache); 
      out.println("testing2"); 

      apiClientService 
        = new FitbitAPIClientService<FitbitApiClientAgent>(
          apiClientAgent, 
          consumerKey, 
          consumerSecret, 
          credentialsCache, 
          entityCache, 
          subscriptionStore 
        ); 
      // out.println("<script>localStorage.setItem('api',apiClientService);</script>"); 
      LocalUserDetail userDetail = new LocalUserDetail("-"); 

      try { 
       // out.println("testing4"); 
       String authorizationURL = apiClientService.getResourceOwnerAuthorizationURL(userDetail, callbackUrl); 
       out.println("access by web browser: " + authorizationURL); 
       out.println("Your web browser shows redirected URL."); 
       out.println("Input the redirected URL and push Enter key."); 
       response.sendRedirect(authorizationURL); 
      } catch (FitbitAPIException ex) { 
       out.println("exception : " + ex); 
       //Logger.getLogger(NewServlet.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } else if (controllerValue.equalsIgnoreCase("Verifier")) { 

      oauth_token = request.getParameter("oauth_token"); 
      oauth_verifier = request.getParameter("oauth_verifier"); 
      resourceCredentials = apiClientService.getResourceCredentialsByTempToken(oauth_token); 

      if (resourceCredentials == null) { 
       out.println(" resourceCredentials = null "); 
       throw new Exception("Unrecognized temporary token when attempting to complete authorization: " + oauth_token); 
      } 
      if (!resourceCredentials.isAuthorized()) { 
       resourceCredentials.setTempTokenVerifier(oauth_verifier); 
       apiClientService.getTokenCredentials(new LocalUserDetail(resourceCredentials.getLocalUserId())); 
      } 
      userId = resourceCredentials.getLocalUserId(); 
      token = resourceCredentials.getAccessToken(); 
      tokenSecret = resourceCredentials.getAccessTokenSecret(); 
      user = new LocalUserDetail(userId); 
      userInfo = apiClientService.getClient().getUserInfo(new LocalUserDetail(resourceCredentials.getLocalUserId())); 
      user = new LocalUserDetail(userId); 
      agent = apiClientService.getClient(); 

      response.sendRedirect("http://localhost:8084/FitbitClientCheck/"); 

} 
1

解決了這個問題。當我重新加載servlet時,'apiClientService'變爲空。使它成員變量和一切開始工作。