我决定使用Volley
并使用Firebase
进入RESTful路由,因为当没有互联网连接时,他们的听众似乎会挂起。至少对于Volley,它让我知道网络请求是否由于互联网连接而未成功。
我需要知道FirebaseUser
auth令牌是否过期。在我的应用程序中,我只允许Google和Facebook身份验证,并且我使用以下代码,假设Firebase用户身份验证令牌不会过期:
private String authToken;
// Callbacks
public interface ApiCallbacks {
public void onSuccess(JSONObject response);
public void onError(String errorString);
}
private interface AuthTokenCallbacks {
public void onAuthTokenSuccess();
public void onAuthTokenError(String errorString);
}
// Request Helpers
private void getAuthToken(final AuthTokenCallbacks callbacks) {
// Lazy instantiation
if (authToken == null) {
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user == null) {
callbacks.onAuthTokenError("Please log in");
} else {
user.getToken(false).addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
@Override
public void onComplete(@NonNull Task<GetTokenResult> task) {
if (task.isSuccessful()) {
authToken = task.getResult().getToken();
callbacks.onAuthTokenSuccess();
} else {
callbacks.onAuthTokenError("Please log in");
}
}
});
}
} else {
callbacks.onAuthTokenSuccess();
}
}
public void sendGetRequestTo(final String endpoint, final HashMap<String, String> arguments, final RequestQueue requestQueue, final String tag, final ApiCallbacks callbacks) {
// Only execute get request if we have an auth token
getAuthToken(new AuthTokenCallbacks() {
@Override
public void onAuthTokenSuccess() {
final String requestUrl = getRequestUrlString(endpoint, arguments);
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, requestUrl, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
callbacks.onSuccess(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
callbacks.onError(error.toString());
}
});
request.setTag(tag);
requestQueue.add(request);
}
@Override
public void onAuthTokenError(String errorString) {
callbacks.onError("Please log in");
}
});
}
这是正确的做法吗?我只是需要知道我是否正朝着正确的方向前进,因为我不希望将来我的授权令牌出现问题(如果他们这样做)。
修改
我忘了提及我的final String requestUrl = getRequestUrlString(endpoint, arguments);
方法基本上构建了url请求字符串,其中auth=authTokenString
附加在我的网址末尾。
答案 0 :(得分:10)
是的,它们确实会过期(您可以在jwt.io 查看到期日期)。如果您不强制刷新(即user.getToken(false)
),则返回的令牌只有在已过期时才会更新。如果您将true
传递给getToken(...)
,则会创建一个新令牌,该令牌也涉及链接的提供商&#39; firebase服务器上的令牌验证(例如,验证用户是否仍然链接了他/她的帐户)。请注意,后者计入您的每日令牌服务配额,因此请确保仅在必要时使用它。