【问题标题】:Firebase Java admin SDK errorFirebase Java 管理员 SDK 错误
【发布时间】:2017-02-07 21:26:37
【问题描述】:

我正在尝试验证用户的 ID 令牌。每当我调用 verifyIdToken 函数时,都会引发以下错误:

java.lang.IllegalArgumentException: projectId 必须设置

这里是servlet代码:

public class GeneratorInfoServlet extends HttpServlet {
    FirebaseApp app = null;

    @Override
    public void init(ServletConfig config) {
        InputStream serviceAccount = Thread.currentThread().getContextClassLoader()
                .getResourceAsStream("/WEB-INF/service_key.json");

        FirebaseOptions options = new FirebaseOptions.Builder()
                .setCredential(FirebaseCredentials.fromCertificate(serviceAccount))
                .setDatabaseUrl("https://project-id.firebaseio.com/")
                .build();

        this.app = FirebaseApp.initializeApp(options);

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter out = resp.getWriter();
        StringBuffer tokenBuffer = new StringBuffer();
        String line;

        try {
            BufferedReader reader = req.getReader();
            while ((line = reader.readLine()) != null)
                tokenBuffer.append(line);

            this.verifyToken(tokenBuffer.toString());
            out.print("{'success': false}");
        } catch (Exception e) {
            System.err.print(e);
            out.print("{'success': true}");
        }
    }

    private void verifyToken(String idToken) {
        System.out.println(app);
        FirebaseAuth.getInstance(this.app).verifyIdToken(idToken)
                .addOnSuccessListener(decodedToken -> {
                    String uid = decodedToken.getUid();
                    System.out.println(uid);
                }).addOnFailureListener(e -> System.out.println(e));
    }
}

我一直在浏览文档,但没有找到直接设置项目 ID 的方法。但是我认为首先它不应该是必要的,因为它已经写在 service_key 和数据库 url 中。

谢谢!

编辑:

常规 Java SDK(非管理员)在 FirebaseOptions 构建器中内置了 setApplicationId("PROJECT_ID") 函数。但是 Admin SDK 中没有这样的选项

【问题讨论】:

    标签: java google-app-engine firebase firebase-admin


    【解决方案1】:

    我正在初始化我的 Firebase 应用程序有点不同,请参阅我的代码

    InputStream in = Thread.currentThread().getContextClassLoader()
                    .getResourceAsStream("/WEB-INF/service_key.json");
    
    FirebaseOptions options = new FirebaseOptions.Builder()
                        .setServiceAccount(in)
                        .setDatabaseUrl(".....")
                        .build();
    

    这适用于我的 Admin SDK 版本 4.0.4

    【讨论】:

    • 我一直在使用最新的 Admin SDK 4.1.1,其中不推荐使用 setServiceAccont 方法。我试图降级到你的版本,之后我得到了 NullPointerException。事实证明,InputStream 为空,并且较新的 SDK 版本未检查空值,并引发误导性的“必须设置项目 ID”错误。非常感谢,您的评论让我明白了问题的核心
    • 呸,对不起!我们将在即将发布的版本中对此进行更新,因此我们会针对这种情况抛出一个更好的错误。
    • 没问题。谢谢
    猜你喜欢
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    • 2019-06-25
    • 2017-09-23
    • 2019-03-14
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    相关资源
    最近更新 更多