如果我的服务器使用用户名/密码进行身份验证并获得后续请求的身份验证令牌,那么解决此问题的最佳方法是什么?
流程应该是这样的: - 开始请求 - 如果我们没有身份验证令牌 - 请使用用户名和密码获取 - 使用身份验证令牌发出请求 - 如果请求因令牌过期而失败,请使用用户名和密码获取新的身份验证令牌 - 使用新的身份验证令牌重试请求 - 完成
我注意到Volley已经可能有一些东西可以解决这个问题 - Authenticator https://android.googlesource.com/platform/frameworks/support/+/4474bc11f64b2b274ca6db5a1e23e8c1d143d5fa/volley/src/com/android/volley/toolbox/Authenticator.java它包含getAuthToken()和invalidateAuthToken()方法,这正是我想要的。但它似乎从未在图书馆中使用过。
答案 0 :(得分:12)
我使用volley作为使用longlive(LLT)和shortlive(SLT)令牌的身份验证系统。
我是手动完成的,但是一旦你完成所有工作,它真的没什么用。
让所有安全请求子类化baseSecureRequest,它可以处理其onResponse()和onErrorResponse()中所有安全请求共有的令牌机制。
它变成了一个小的node.js样式,其中请求发送其他请求并等待回调。
一个应用程序可能有十几个屏幕,只有一半需要授权访问 - 因此每个屏幕应该无视其请求的要求。
情景A
情景B
我们发送安全请求,但我们的SLT过时(已过期)
服务器返回您可以捕获的错误代码或消息 你的baseSecureRequest的一般onErrorResponse()。
在这个onError()中,你发送一个refreshTokenRequest()对象 尝试使用LLT从服务器请求新的SLT来刷新内存中的SLT。
refreshTokenRequest的onResponse()现在可以回调到 原始要求重新发送。
答案 1 :(得分:1)
答案 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帐户登录。