Android - Firebase用户验证令牌是否过期?

Raf*_*afi 9 android firebase firebase-authentication

我决定使用Volley并使用RESTful路由,Firebase因为他们的听众似乎在没有互联网连接时挂起.至少对于Volley,它让我知道网络请求是否由于互联网连接而未成功.

我需要知道FirebaseUserauth令牌是否过期.在我的应用程序中,我只允许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");
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

这是正确的做法吗?我只需要知道我是否正朝着正确的方向前进,因为我不希望将来我的auth令牌出现问题(如果他们这样做).

编辑

我忘了提到我的final String requestUrl = getRequestUrlString(endpoint, arguments);方法基本上构造了url请求字符串,并auth=authTokenString附加在我的url的末尾.

Ger*_*ssy 10

是的,它们确实会过期(您可以在jwt.io查看到期日期).如果您不强制刷新(即user.getToken(false)),则返回的令牌仅在其已过期时才会更新.如果您true转到getToken(...),将创建一个新令牌,该令牌还涉及firebase服务器上的链接提供商令牌验证(例如,验证用户是否仍然链接了他/她的帐户).请注意,后者计入您的每日令牌服务配额,因此请确保仅在必要时使用它.