首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用BMS客户端时,令牌是如何和何时刷新的,是否有一种强制刷新的方法?

在使用BMS客户端时,令牌是如何和何时刷新的,是否有一种强制刷新的方法?
EN

Stack Overflow用户
提问于 2016-03-09 09:19:57
回答 2查看 344关注 0票数 2

我们正在使用:

代码语言:javascript
复制
BMSClient.getInstance().registerAuthenticationListener("realm", new CustomAuthentication(this));

以及:

代码语言:javascript
复制
AuthorizationManager.createInstance(this.getApplicationContext());
AuthorizationManager.getInstance().setAuthorizationPersistencePolicy(AuthorizationManager.PersistencePolicy.ALWAYS);

要将授权数据存储在电话中,请执行以下操作。“授权数据将保存在本地存储”设置为“始终”。

上面的代码总是在启动时在我们的屏幕上运行,所以它总是在应用程序重新启动时运行。

我们遇到的问题是,经过一段时间(几个小时或几天)之后,当我们怀疑令牌过期时,我们会得到以HTTP307形式的响应。即使在重新启动应用程序之后,我们仍然会在请求中得到这个响应。绕过它的唯一方法是从设置中进入应用程序并清除所有数据。

以下问题将有助于我们在测试和可能的解决方案方面取得进展:

  1. 令牌在BMSClient中缓存多长时间?(测试目的)
  2. AuthorizationManager能以任何方式帮助我们强制获取新的令牌吗?
  3. 他们在做注销功能吗?

我们的自定义听者:

代码语言:javascript
复制
public class CustomAuth implements AuthenticationListener {

    private Context activityContext;

    public CustomAuth(Context activityContext) {
        this.activityContext = activityContext;
    }

    @Override
    public void onAuthenticationChallengeReceived(AuthenticationContext authContext, JSONObject challenge, Context context) {
        //1. read the challenge JSONObject
        //2. handle the challenge (use the context for handling UI based operations)
        //3. return response using the AuthenticationContext authContext
        SharedPreferences preferences = activityContext.getSharedPreferences("UserPreference", Context.MODE_PRIVATE);
        String email = preferences.getString("email", "");
        if(email.equals("")) {
            email = "unidentified-user@error.com";
        }
        JSONObject jsonEmail = new JSONObject();
        try {
            jsonEmail.put("email", email);
        } catch (JSONException e) {
            authContext.submitAuthenticationChallengeAnswer(null);
        }
        authContext.submitAuthenticationChallengeAnswer(jsonEmail);

    }

    @Override
    public void onAuthenticationSuccess(Context context, JSONObject info) {
        //additional operations in case of authentication success
        Log.d("Authentication", "Auth success: " + String.valueOf(info));
    }

    @Override
    public void onAuthenticationFailure(Context context, JSONObject info) {
        //additional operations in case of authentication failure
        Log.d("Authentication", "Auth failure ." + String.valueOf(info));
    }
}
EN

回答 2

Stack Overflow用户

发布于 2016-03-15 14:10:26

当接收到307并重新发送请求时,您是否尝试过使用AuthorizationManager.clearAuthorizationData() API?

票数 1
EN

Stack Overflow用户

发布于 2016-03-10 15:16:49

回答你的问题:

1)将无限期地缓存授权令牌。该令牌在60分钟时间内过期,但将保持缓存状态,直到获得新令牌为止。

最佳做法是在原始令牌过期后获得一个新令牌。这可以通过在前一个令牌过期后运行一个新的授权挑战来实现。

2)您可以通过访问受保护的资源,使用AuthorizationManager等方式,在前一个令牌过期后始终使用obtainAuthorizationHeader获取新令牌。

3)目前无法使用AuthorizationManager注销MCA。我将与开发团队讨论未来的计划。

关于我在你的问题中看到的主要问题。我希望您正经历此问题,因为您正在尝试对授权服务使用过期令牌。即使令牌仍然被缓存在设备上,它在创建一个小时后就过期了。一旦令牌过期,我将尝试对MCA服务运行新的授权挑战。

如果您想提供您的代码,也可以帮助我进一步调查。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35887438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档