尝试完成授权时无法识别的临时令牌:FITBIT4J

Unrecognized temporary token when attempting to complete authorization: FITBIT4J

我正在尝试使用 fitbit4j 为 fitbit 创建一个应用程序。我找到了他们的示例代码 在 https://github.com/apakulov/fitbit4j/blob/master/fitbit4j-example-client/src/main/java/com/fitbit/web/FitbitApiAuthExampleServlet.java

当我尝试实现它时,我遇到了很多错误。 下面是他们的 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);
        }
    }
}

当我 运行 代码首先进入 'else' 部分,然后我得到 URL localhost:8080/fitbitApiAuthExample?completeAuthorization=&oauth_token=5bccadXXXXXXXXXXXXXXXXXXXXXXXX&oauth_verifier=h35kXXXXXXXXXXXXXXXXX,我得到 fitbit 登录屏幕,当我登录时 自从 'completeAuthorization==null',

它正在执行 else 部分 again.So 我手动添加了一个值,以便它进入 'if' 部分。 所以新的 URL 变成了 localhost:8080/fitbitApiAuthExample?completeAuthorization=Success&oauth_token=5bccadXXXXXXXXXXXXXXXXXXXXXXXX&oauth_verifier=h35kXXXXXXXXXXXXXXXXX 并进入了 'if' 部分。

现在我得到了例外 '尝试完成授权时无法识别临时令牌:'我尝试了很多解决方法,但仍然无法理解错误。

请帮忙。

问题解决了。当我重新加载 servlet 时,'apiClientService' 变为空。使它成为成员变量,一切都开始工作了。

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/");

}