java - 如何在 google 端点中验证 firebase token ?

标签 java firebase google-app-engine firebase-authentication google-cloud-endpoints

我已遵循 Firebase 身份验证的文档以及相关教程。 假设 token 将从 header 进入客户端,我创建了一个自定义身份 validator 类,并且收到一个错误,任务说明 The type TaskQueuePb.TaskQueueQueryAndOwnTasksResponse.Task is not generic; it cannot be parameterized with arguments <FirebaseToken> 但是,我没有看到任何其他导入,并且教程似乎没有对此进行更多解释。

请引用以下代码:

package com.travelplannr.endpoint.firebase;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.concurrent.ExecutionException;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.servlet.http.HttpServletRequest;

import com.google.api.server.spi.ServiceException;
import com.google.api.server.spi.auth.common.User;
import com.google.api.server.spi.config.Authenticator;
import com.google.appengine.api.taskqueue.TaskQueuePb.TaskQueueQueryAndOwnTasksResponse.Task;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.firebase.FirebaseApp;
import com.google.firebase.FirebaseOptions;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseToken;

public class CustomAuthenticator implements Authenticator {

     private static final Logger logger = Logger.getLogger(CustomAuthenticator.class.getName());

        static {
            try {
                FileInputStream serviceAccount = new FileInputStream("path/to/serviceAccountKey.json");

                FirebaseOptions options = new FirebaseOptions.Builder()
                    .setCredentials(GoogleCredentials.fromStream(serviceAccount))
                    .setDatabaseUrl("https://<DATABASE_NAME>.firebaseio.com/")
                    .build();

                FirebaseApp.initializeApp(options);

            } catch (Exception e) {
                logger.log(Level.SEVERE, e.toString(), e);
            }
        }

        @Override
        public User authenticate(HttpServletRequest httpServletRequest) {

            //get token
            final String authorizationHeader = httpServletRequest.getHeader("Authorization");

            //verify
            if(authorizationHeader != null) {
                Task<FirebaseToken> task = FirebaseAuth.getInstance().verifyIdToken(authorizationHeader.replace("Bearer ", ""));

                //wait for the task
                try {
                    Tasks.await(task);
                } catch (ExecutionException e) {
                } catch (InterruptedException e) {
                }

                FirebaseToken firebaseToken = task.getResult();
                User user = new User(firebaseToken.getUid(), firebaseToken.getEmail());
                return user;
            }
        return null;
    }
}

请帮忙! 提前致谢。

最佳答案

我认为在同一行代码中存在两个不同的问题。首先,您的作业中的左侧接收类型与返回类型似乎不匹配。从FirebaseAuth Java API reference我可以看到,方法签名为:

FirebaseToken verifyIdToken(String token)

所以,verifyIdToken返回 FirebaseToken ,但您试图将其分配给 Task<FirebaseToken> ,这是一种不同的、不兼容的类型。其次,Task<FirebaseToken>尝试使用也是非法类型,因为这个 Task类不是泛型的,因此它根本不能参数化。这是您从编译器中看到的错误,但如果您放弃使用 Task,则该详细信息将变得无关紧要。完全是这样,因为没有必要:

FirebaseToken firebaseToken = FirebaseAuth.getInstance().verifyIdToken(authorizationHeader.replace("Bearer ", ""));

只需删除尝试使用 Task 周围的所有其他代码即可和Tasks.await() .

看起来您可能已经混合和匹配了有关如何进行此调用的同步和异步信息源。由于您编写的代码无论如何都会立即等待异步任务完成,因此您可能应该坚持使用 API 的同步版本 ( verifyIdToken() ),而不是尝试使用异步变体 ( verifyIdTokenAsync() )。 ),这可能会在尝试遵循示例时引起一些困惑。

关于java - 如何在 google 端点中验证 firebase token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54151958/

相关文章:

java - 迭代时 HashMap 抛出奇怪的异常

java - 使用引号 (') 的 Switch-Case

java - 在全屏android中使用recyclerview滑动图像

java - 是否有用于 PDF/A 的 PDFSmartCopy

android - Gradle 必须依赖 com.google.firebase :firebase-core for Firebase services to work as intended

ios - swift 和火力地堡 : Retrieving location data from Firebase to show on Google map marker

ios - 打开应用程序时表格 View 未刷新

java - Jersey 和 Google App Engine (GAE) 不适合我

java - 部署后无法访问 Google App Engine 中的 Spring Boot 应用程序

java - GAE Java Flexible env 502 坏网关