【问题标题】:Android process for "silently" using refresh token to get new access tokenAndroid进程“静默”使用刷新令牌来获取新的访问令牌
【发布时间】:2014-05-18 08:17:42
【问题描述】:

我目前正在尝试处理我正在编写的演示应用程序中的一种情况,其中我有一个过期的访问令牌,我需要使用刷新令牌来获取一个新的访问令牌。现在对于这样的后台任务,我通常会像我的应用程序当前那样使用 AsyncTask 来登录(这工作正常),但我不知道如何做到这一点 - 如果它甚至可以完成(我确定它可以,但我现在没看到)。

以下是我当前的流程 - 对 get() 的调用阻塞了 UI 线程,这不是我应该在这里做的。我们的访问票据类同时包含访问令牌和刷新令牌。

public boolean isLoggedIn() {
    if (isFreshAccessToken())
        return true;

    // If the access token is expired, we'll need to use the
    // refresh token to get another one.  Use a background task
    // to do this.
    String refreshToken = preferences.getString(REFRESH_TOKEN_KEY, null);
    if (StringUtils.isNotBlank(refreshToken)) {
        RefreshAccessTokenAsyncTask refreshLogin = new RefreshAccessTokenAsyncTask();
        refreshLogin.execute(refreshToken);

        try {
            return refreshLogin.get();
        } catch (Exception e) {
            Log.d(TAG, "isLoggedIn() : Exception in async task.  Returning false.");
            return false;
        }
    } else
        return false;
}

这是我的 AsyncTask 实现当前的样子。 refreshAccessTicket() 方法只是进行 REST 调用以获取 AccessTicket 响应。

private class RefreshAccessTokenAsyncTask extends AsyncTask<String, Void, Boolean> {

    @Override
    protected Boolean doInBackground(String... params) {
        String refreshToken = params[0];
        try {

            // Get a new access token using the refresh token
            // in the background ...
            AccessTicket accessTicket = refreshAccessTicket(refreshToken);

            // ... and save the updated information to the shared
            // preferences
            saveAccessTicket(accessTicket);
            return true;
        } catch (Exception ex) {

            // If the call for a new access token fails for any reason,
            // return FALSE.  We'll force the user to log in again to
            // get a completely new access ticket.
            return false;
        }
    }

    @Override
    protected void onPostExecute(Boolean isLoggedIn) {
        super.onPostExecute(isLoggedIn);
        Log.d(TAG, "RefreshAccessTokenAsyncTask.onPostExecute() : " +
                "Returning isLoggedIn value of " + isLoggedIn);
    }

}

我在这里缺少什么?正如我上面提到的,我希望这个过程保持静默 - 如果访问令牌已过期,我想使用刷新令牌自动获取新的访问令牌,而无需用户执行任何操作或让应用程序跳出当前流程的(例如获取朋友列表等) - 它会在后台发生。我应该使用 AsyncTask 以外的东西吗?

【问题讨论】:

    标签: java android android-asynctask android-handler


    【解决方案1】:

    AsyncTask 应该可以正常工作,但您无法获得这样的结果。试试这样吧。

    private interface Callback {
    void done(boolean result);
    }
    
    private class RefreshAccessTokenAsyncTask extends AsyncTask<String, Void, Boolean> {
    
    private Callback cb;
    
    private RefreshAccessTokenAsyncTask(Callback callback)
        cb = callback;
    }
    
    @Override
    protected Boolean doInBackground(String... params) {
        String refreshToken = params[0];
        try {
    
            // Get a new access token using the refresh token
            // in the background ...
            AccessTicket accessTicket = refreshAccessTicket(refreshToken);
    
            // ... and save the updated information to the shared
            // preferences
            saveAccessTicket(accessTicket);
            return true;
        } catch (Exception ex) {
    
            // If the call for a new access token fails for any reason,
            // return FALSE.  We'll force the user to log in again to
            // get a completely new access ticket.
            return false;
        }
    }
    
    @Override
    protected void onPostExecute(Boolean isLoggedIn) {
        super.onPostExecute(isLoggedIn);
        Log.d(TAG, "RefreshAccessTokenAsyncTask.onPostExecute() : " +
                "Returning isLoggedIn value of " + isLoggedIn);
        cb.done(isLoggedIn);
    }
    

    }

    然后像这样使用 AsyncTask:

    public boolean isLoggedIn() {
    if (isFreshAccessToken())
        return true;
    
    // If the access token is expired, we'll need to use the
    // refresh token to get another one.  Use a background task
    // to do this.
    String refreshToken = preferences.getString(REFRESH_TOKEN_KEY, null);
    if (StringUtils.isNotBlank(refreshToken)) {
        Callback callback = new Callback() {
            public void done(boolean result){
                // whatever you need to do here
            }
        }
        RefreshAccessTokenAsyncTask refreshLogin = new RefreshAccessTokenAsyncTask(callback);
        refreshLogin.execute(refreshToken);
    } else
        return false;
    }
    

    【讨论】:

      猜你喜欢
      • 2015-07-19
      • 2018-12-20
      • 2022-01-23
      • 2016-09-28
      • 2015-11-26
      • 2020-06-12
      • 2020-02-26
      • 2013-08-23
      相关资源
      最近更新 更多