【问题标题】:How to verify firebase token in google endpoints?如何在谷歌端点中验证 Firebase 令牌?
【发布时间】:2019-01-11 18:13:54
【问题描述】:

我已按照 firebase 身份验证的文档以及有关此的教程进行操作。 假设令牌将从标头进入客户端,我创建了一个自定义身份验证器类,并且我收到一个错误的任务声明 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;
    }
}

请帮忙! 提前致谢。

【问题讨论】:

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


    【解决方案1】:

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

    FirebaseToken verifyIdToken(String token)
    

    所以,verifyIdToken 返回一个 FirebaseToken,但您试图将它分配给 Task&lt;FirebaseToken&gt;,这是一个不同的、不兼容的类型。其次,Task&lt;FirebaseToken&gt; 也是尝试使用的非法类型,因为这个Task 类不是泛型的,所以它根本不能被参数化。这是您从编译器看到的错误,但是如果您完全放弃使用 Task,那么该细节将变得无关紧要,因为它是不必要的:

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

    只需删除您尝试使用TaskTasks.await() 的所有其他代码。

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

    【讨论】:

    • 感谢您的解释!是的,我已经完全删除了该任务,它现在正在运行。
    猜你喜欢
    • 2017-07-13
    • 1970-01-01
    • 2020-12-07
    • 2013-03-29
    • 1970-01-01
    • 2021-02-11
    • 1970-01-01
    • 2017-10-30
    • 1970-01-01
    相关资源
    最近更新 更多