2013-07-01 41 views
17

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

流程应该是这样的: - 启动要求 - 如果我们没有身份验证令牌 - 用户名和密码 得到它 - 让与请求的身份验证令牌 - 如果请求失败,因为令牌过期,获得新权威性与用户名和密码令牌 - 完成

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

+0

我刚刚查看了源代码,它看起来像你一样 - 代码中没有使用Authenticator。所以可能你必须手动完成。 – negersiu

+0

是的。与此同时,我复制了BasicNetwork类并在那里进行了调整,以便为我执行身份验证。 – MantasV

+2

你可以发布你如何做它的答案,请 –

回答

11

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

我手动完成了,但一旦你完成了所有工作,它确实没有太多的工作。

让所有安全要求子类baseSecureRequest可以处理此令牌机制共同在其onResponse()和onErrorResponse()所有安全要求。

就显得有点node.js的风格,在那里请求发送其他请求,并等待回调。


的应用程序可能有十几个画面,只有一半需要身份验证的访问 - 所以每个屏幕应该是无知其请求的要求。

方案A

  • 我们试图发送一个安全的请求。我们注意到我们在 内存中没有SLT,因此请创建一个TokenRequest。
  • TokenRequest的onResponse()保存 该令牌内存(让单会话管理器抓住它或 类似无所不在的类)
  • 现在回调到原来的 具体类的请求对象继续与最新更新令牌。

方案B

  • 我们发送的安全要求,但我们的SLT是陈旧的(已过期)

  • 服务器返回错误代码或味精,你可以在 赶上一般onErrorResponse()你的baseSecureRequest。

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

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

  • 但是onErrorResponse()或许应该放弃整个事情,因为机会是 任何不是一个连接错误 - 是由 无效LLT错误。如果你一直试图刷新一个不好的LLT,你将永远不会离开。
+9

@mjw ...你有这样的代码示例吗? –

+4

我第二个这个议案,任何代码? – CQM

+2

我同意。我们可以为此得到一些示例代码吗? – HariKJ

1
  1. 您可能想要在Android中使用AccountManager API进行身份验证和授权。您可以按照博客here
  2. 对于OAuth 2.0服务器端实现,您可以阅读IETF草稿V2-31 here
  3. 为了更好地理解OAuth 2.0,您可以阅读Nitesh Kumarhere的博客。
  4. 对于服务器端执行的OAuth 2.0,您可以在Github上叉Apis Autherization Server回购。
  5. 更多的实施选项可以在OAuth 2.0的网站上找到here
+0

感谢您的回应,但我的问题是专门针对Volley。这不是关于如何进行授权,但如何将其与Volley – MantasV

+0

集成AndroidAuthenticator似乎使用accountManager,但我不知道我们应该如何使用AndroidAuthenticator。 –

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; 
    } 
+0

链接关闭。你有这样的另一篇文章吗? – davidbonachera

+1

@davidbonachera链接的博客最近被移动(并重新命名)我更新了链接。 – njzk2

+0

尽管这个链接可能回答这个问题,但最好在这里包含答案的基本部分,并提供供参考的链接。如果链接页面更改,则仅链接答案可能会失效。 - [来自评论](/ review/low-quality-posts/18821940) –

-2

getToken()失败。状态BAD_AUTHENTICATION错误

我也面临同样的问题。

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

+0

这应该是一个答案或一个新的问题? –

相关问题