Как защитить свои API Google Cloud Endpoints с помощью проверки токена Firebase?

Моя настройка:

Серверная часть Java, размещенная в Google App Engine, содержит API, созданные с использованием конечных точек Google Cloud.Мобильные клиентские приложения, содержащие сгенерированные клиентские библиотеки для конечных точек, упомянутых выше. Также интегрирован с Firebase для аутентификации и базы данных.

Мое намерение состоит в том, чтобы пользователь мобильных клиентских приложений мог войти в мобильное приложение с использованием аутентификации Firebase, а затем подключиться к любому из внутренних API-интерфейсов, которые, в свою очередь, выполнят некоторую обработку, а затем прочитают или запишут данные в / из база данных Firebase.

Чтобы защитить API на сервере, я думаю, что мне придется использовать встроенный метод verifyIdToken () пакета Firebase Server SDK для (см.Проверка идентификационных токенов в Firebase) для декодирования токена ID пользователя, переданного из клиентского приложения. Так как verifyIdToken () работает асинхронно, как бы я интегрировал его с методом API в GAE? Пока у меня есть нечто похожее на следующее:

@ApiMethod(name = "processAndSaveToDB", httpMethod = "post")
    public Response processAndSaveToDB(@Named("token") String token) {

        Response response = new Response();           

        // Check if the user is authenticated first
        FirebaseAuth.getInstance().verifyIdToken(idToken)
            .addOnSuccessListener(new OnSuccessListener() {
                @Override
                public void onSuccess(FirebaseToken decodedToken) {
                    String uid = decodedToken.getUid();

                    // do bulk of processAndSaveToDB() method

                })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(Exception e) {

                    // throw unauthorized exception

            });

    return response;
}
 gbhall06 сент. 2016 г., 08:01
Вы достигли этого, используя гибкую среду App Engine или стандартную среду App Engine?

Ответы на вопрос(1)

Решение Вопроса

вы можете подождать, пока эта задача не будет завершена, и продолжить синхронно, при желании вы можете добавить прослушиватели onSuccess, onFailure и onComplete.

Task<FirebaseToken> authTask = FirebaseAuth.getInstance().verifyIdToken(idToken)
.addOnSuccessListener(new OnSuccessListener() {
        @Override
        public void onSuccess(Object tr) {//do smtg }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(Exception excptn) {//do smtg }
    }).addOnCompleteListener(new OnCompleteListener() {
        @Override
        public void onComplete(Task task) {//do smtg }
    });
    try {
        Tasks.await(authTask);
    } catch(ExecutionException | InterruptedException e ){
        //handle error
    }
    FirebaseToken decodedToken = authTask.getResult();
 user218194818 июл. 2016 г., 05:40
Это прекрасно работает, спасибо!

Ваш ответ на вопрос