使用Volley进行令牌认证

时间:2013-07-01 08:42:13

标签: android android-volley

如果我的服务器使用用户名/密码进行身份验证并获得后续请求的身份验证令牌,那么解决此问题的最佳方法是什么?

流程应该是这样的: - 开始请求 - 如果我们没有身份验证令牌 - 请使用用户名和密码获取 - 使用身份验证令牌发出请求 - 如果请求因令牌过期而失败,请使用用户名和密码获取新的身份验证令牌 - 使用新的身份验证令牌重试请求 - 完成

我注意到Volley已经可能有一些东西可以解决这个问题 - Authenticator https://android.googlesource.com/platform/frameworks/support/+/4474bc11f64b2b274ca6db5a1e23e8c1d143d5fa/volley/src/com/android/volley/toolbox/Authenticator.java它包含getAuthToken()和invalidateAuthToken()方法,这正是我想要的。但它似乎从未在图书馆中使用过。

5 个答案:

答案 0 :(得分:12)

我使用volley作为使用longlive(LLT)和shortlive(SLT)令牌的身份验证系统。

我是手动完成的,但是一旦你完成所有工作,它真的没什么用。

让所有安全请求子类化baseSecureRequest,它可以处理其onResponse()和onErrorResponse()中所有安全请求共有的令牌机制。

它变成了一个小的node.js样式,其中请求发送其他请求并等待回调。


一个应用程序可能有十几个屏幕,只有一半需要授权访问 - 因此每个屏幕应该无视其请求的要求。

情景A

  • 我们尝试发送安全请求。我们注意到我们没有SLT 记忆,所以做一个TokenRequest。
  • TokenRequest的onResponse()保存 该令牌到内存(让单个会话管理器保持在它或 类似的全方位课程)
  • 现在回复原文 具体类请求对象以继续使用新更新的令牌。

情景B

  • 我们发送安全请求,但我们的SLT过时(已过期)

  • 服务器返回您可以捕获的错误代码或消息 你的baseSecureRequest的一般onErrorResponse()。

  • 在这个onError()中,你发送一个refreshTokenRequest()对象 尝试使用LLT从服务器请求新的SLT来刷新内存中的SLT。

  • refreshTokenRequest的onResponse()现在可以回调到 原始要求重新发送。

  • 然而onErrorResponse()应该放弃整个事情,因为机会是 任何不是连接错误的错误 - 都是由错误引起的 LLT无效。如果你继续尝试刷新一个糟糕的LLT,你将永远不会离开。

答案 1 :(得分:1)

  1. 您可能希望使用Android中的AccountManager API进行身份验证和授权。您可以关注博客here
  2. 对于OAuth 2.0服务器端实现,您可以阅读IETF草案V2-31 here
  3. 为了更好地了解OAuth 2.0,您可以通过Nitesh Kumar here阅读博客。
  4. 对于OAuth 2.0的服务器端实现,您可以在Github上分叉Apis Autherization Server repo。
  5. 可以在OAuth 2.0 here的网站上找到更多实施选项。

答案 2 :(得分:1)

你看过这篇博文了吗? https://smaspe.github.io/2013/06/06/volley-part2.html

演示了一种覆盖请求对象以使用twitter令牌的简单方法。

@Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        Map<String, String> headers = new HashMap<String, String>();
        String auth = "Basic "
                + Base64.encodeToString((TwitterValues.CONSUMER_KEY 
                + ":" + TwitterValues.CONSUMER_SECRET).getBytes(),
                        Base64.NO_WRAP);
        headers.put("Authorization", auth);
        return headers;
    }

答案 3 :(得分:0)

对于我来说,我将“基本”身份验证更改为令牌身份验证,如下所示:

K

我所做的是将登录名保存在全局静态变量中,然后可以使用它。

答案 4 :(得分:-2)

getToken()失败了。状态BAD_AUTHENTICATION错误

我也遇到了同样的问题。

解决方案:检查设备是否已使用您的Google帐户登录。