Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Google云端点在端点中执行异步代码_Java_Android_Google App Engine_Firebase Authentication_Google Compute Engine - Fatal编程技术网

Java Google云端点在端点中执行异步代码

Java Google云端点在端点中执行异步代码,java,android,google-app-engine,firebase-authentication,google-compute-engine,Java,Android,Google App Engine,Firebase Authentication,Google Compute Engine,我正在尝试在GCE端点中对Android中Firebase身份验证库创建的客户端令牌进行身份验证 可以找到如何执行此操作的指南 基本上,我需要从端点调用此代码段(即服务器后端代码而不是android代码) FirebaseAuth.getInstance().verifyIdToken(idToken) .addOnSuccessListener(新的OnSuccessListener(){ @凌驾 成功时公共无效(FirebaseToken已解码){ 字符串uid=decodedToken.g

我正在尝试在GCE端点中对Android中Firebase身份验证库创建的客户端令牌进行身份验证

可以找到如何执行此操作的指南

基本上,我需要从端点调用此代码段(即服务器后端代码而不是android代码)

FirebaseAuth.getInstance().verifyIdToken(idToken)
.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(FirebaseToken已解码){
字符串uid=decodedToken.getUid();
// ...
}
});
假设我想执行该代码并将用户返回到android客户端代码。我该怎么做

这是我的示例代码,没有意义。但它证明了我想做什么

@ApiMethod(name = "serverAuth")
public MyUser serverAuth(@Named("token") String token) {
    FirebaseAuth.getInstance().verifyIdToken(token)
            .addOnSuccessListener(new OnSuccessListener<FirebaseToken>() {
                @Override
                public void onSuccess(FirebaseToken decodedToken) {
                    String uid = decodedToken.getUid();
                    String email = decodedToken.getEmail();
                    String name = decodedToken.getName();
                    Map<String, Object> claims = decodedToken.getClaims();

                    String claimString = "";

                    for (Object claim : claims.values()) {
                        claimString += claims.toString();
                    }

                    MyUser user = new MyUser(uid, email, name, claimString);
                    //How to return this user?

                }
            });

    //This is compile error since user varriable does not exist here    
    return user;

}
@ApiMethod(name=“serverAuth”)
公共MyUser serverAuth(@Named(“令牌”)字符串令牌){
FirebaseAuth.getInstance().verifyIdToken(令牌)
.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(FirebaseToken已解码){
字符串uid=decodedToken.getUid();
字符串email=decodedToken.getEmail();
字符串名称=decodedToken.getName();
Map claims=decodedToken.getClaims();
字符串claimString=“”;
for(对象声明:claims.values()){
claimString+=claims.toString();
}
MyUser=新的MyUser(uid、电子邮件、名称、claimString);
//如何返回此用户?
}
});
//这是编译错误,因为此处不存在用户变量
返回用户;
}

我在谷歌搜索如何在GCE端点中执行异步代码。但这是行不通的。我得到的是一些关于代码执行的东西,它会一直阻塞直到完成,然后返回给用户。但是如何编码使上面的异步代码变成阻塞?

CountDownLatch是您需要的神奇类。它将让您等待OnSuccessListener实际完成

以这种方式调整您的方法:(我删除了导致MyUser创建的步骤,以便专注于重点。)


就这样。希望这能有所帮助。

谢谢!它起作用了。然而,我得到的错误是,用户变量是最终的,不能设置。我通过将用户升级到类私有变量来解决这个问题。这只是一个测试代码,所以允许凌乱。但我仍然有兴趣听到一个更好的方法来做用户变量作为最终变量。是的,你是对的-指定最终变量是被禁止的。对不起,样品没有经过完全测试。但是我认为使用类变量并不是最好的解决方法。我宁愿使用“容器”或“包装器”。请参阅我的最新答案。
@ApiMethod(name = "serverAuth")
public MyUser serverAuth(@Named("token") String token) {
    FirebaseAuth.getInstance().verifyIdToken(token)
            .addOnSuccessListener(new OnSuccessListener<FirebaseToken>() {
                @Override
                public void onSuccess(FirebaseToken decodedToken) {
                    String uid = decodedToken.getUid();
                    String email = decodedToken.getEmail();
                    String name = decodedToken.getName();
                    Map<String, Object> claims = decodedToken.getClaims();

                    String claimString = "";

                    for (Object claim : claims.values()) {
                        claimString += claims.toString();
                    }

                    MyUser user = new MyUser(uid, email, name, claimString);
                    //How to return this user?

                }
            });

    //This is compile error since user varriable does not exist here    
    return user;

}
@ApiMethod(name = "serverAuth")
public MyUser serverAuth(@Named("token") String token) {
    final List<MyUser> users = new ArrayList<>();
    final CountDownLatch cdl = new CountDownLatch(1);
    FirebaseAuth.getInstance().verifyIdToken(token)
            .addOnSuccessListener(new OnSuccessListener<FirebaseToken>() {
                @Override
                public void onSuccess(FirebaseToken decodedToken) {
                    // ... init uid, email, name and claimString
                    users.add(new MyUser(uid, email, name, claimString));
                    cdl.countDown();
                }
            });
    try {
        cdl.await(); // This line blocks execution till count down latch is 0
    } catch (InterruptedException ie) {

    }
    if (users.size() > 0) {
        return users.get(0);
    } else {
        return null ;
    }
}
FirebaseAuth.getInstance().verifyIdToken(token)
.addOnSuccessListener(new OnSuccessListener<FirebaseToken>() {
    @Override
    public void onSuccess(FirebaseToken decodedToken) {
        cdl.countDown();
    }
}).addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception e) {
        // log error, ...
        cdl.countDown();
    }
});
try {
     // This line blocks execution till count down latch is 0
     // or after 30 seconds.
    cdl.await(30l, TimeUnit.SECONDS);
} catch (InterruptedException ie) {

}