Android Firebase服务帐户凭据Json读取权限被拒绝

Android Firebase服务帐户凭据Json读取权限被拒绝,android,json,google-app-engine,google-cloud-endpoints,firebase-realtime-database,Android,Json,Google App Engine,Google Cloud Endpoints,Firebase Realtime Database,我从Firebase控制台下载了我的服务帐户凭据json文件,当我在本地运行我的备份时,我将该文件放在了GAE端点项目的主目录中,它给出了安全异常 java.security.AccessControlException: access denied ("java.io.FilePermission" "\src\main\secret.json" "read") 我也尝试将.json文件放在src目录下,但没有任何帮助。您应该将json文件放在src/main/resources我找到了两种

我从Firebase控制台下载了我的服务帐户凭据json文件,当我在本地运行我的备份时,我将该文件放在了GAE端点项目的主目录中,它给出了安全异常

java.security.AccessControlException: access denied ("java.io.FilePermission" "\src\main\secret.json" "read")

我也尝试将.json文件放在src目录下,但没有任何帮助。

您应该将json文件放在
src/main/resources
我找到了两种方法。首先是通过互联网流从文件中获取。另一个是本地的

互联网方式

我的第一种方法是将文件存储在我的公共dropbox文件夹中。我获得了可共享链接(确保它以
.json
结尾),并将其粘贴到字符串示例
”中https://dl.dropboxusercontent.com/..EXAMPLE-CREDENTIALS“

/**一个简单的端点方法,它接受一个名称并返回Hi*/
@ApiMethod(name=“sayHi”)
公共MyBean sayHi(@Named(“name”)字符串名){
MyBean mModelClassObject=null;
字符串文本=”;
试一试{
字符串行=”;
StringBuilder=新的StringBuilder();
URL=新URL(“https://dl.dropboxusercontent.com/..EXAMPLE-CREDENTIALS");
BufferedReader=新的BufferedReader(新的InputStreamReader(url.openStream());
而((line=reader.readLine())!=null){
// ...
builder.append(行);
}
reader.close();
text=builder.toString();
}捕获(格式错误){
// ...
}捕获(IOE异常){
// ...
}
InputStream=newbytearrayinputstream(text.getBytes(StandardCharsets.UTF_8));
FirebaseOptions=null;
选项=新的FirebaseOptions.Builder()
.setServiceAccount(流)
.setDatabaseUrl(“https://[PROJECT-ID].firebaseio.com/”)
.build();
FirebaseApp.initializeApp(选项);
DatabaseReference ref=FirebaseDatabase.getInstance().getReference();
final TaskCompletionSource tcs=新TaskCompletionSource();
Task tcsTask=tcs.getTask();
ref.addListenerForSingleValueEvent(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
MyBean result=dataSnapshot.getValue(MyBean.class);
如果(结果!=null){
tcs.setResult(结果);
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
//处理错误
}
});
试一试{
mModelClassObject=Tasks.await(tcsTask);
}捕获(执行例外){
//处理异常
}捕捉(中断异常e){
//处理异常
}
返回mModelClassObject;
}
本地方式

另一种方法是使用上面的版本并跳过dropbox之类的内容

/** A simple endpoint method that takes a name and says Hi back */
        @ApiMethod(name = "sayHi")
    public MyBean sayHi(@Named("name") String name) {

        MyBean mModelClassObject = null;

        String text = "JUST PASTE YOUR JSON CONTENTS HERE";

        InputStream stream = new ByteArrayInputStream(text.getBytes(StandardCharsets.UTF_8));

        FirebaseOptions options = null;
        options = new FirebaseOptions.Builder()
                .setServiceAccount(stream)
                .setDatabaseUrl("https://[PROJECT-ID].firebaseio.com/")
                .build();
        FirebaseApp.initializeApp(options);

        DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
        final TaskCompletionSource<MyBean> tcs = new TaskCompletionSource<>();


        Task<MyBean> tcsTask = tcs.getTask();

        ref.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                MyBean result = dataSnapshot.getValue(MyBean.class);
                if(result != null){
                    tcs.setResult(result);
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError){
                //handle error
            }
        });

        try {
            mModelClassObject = Tasks.await(tcsTask);
        }catch(ExecutionException e){
            //handle exception
        }catch (InterruptedException e){
            //handle exception
        }

        return mModelClassObject;
    }
/**一个简单的端点方法,它接受一个名称并返回Hi*/
@ApiMethod(name=“sayHi”)
公共MyBean sayHi(@Named(“name”)字符串名){
MyBean mModelClassObject=null;
String text=“只需在此处粘贴JSON内容”;
InputStream=newbytearrayinputstream(text.getBytes(StandardCharsets.UTF_8));
FirebaseOptions=null;
选项=新的FirebaseOptions.Builder()
.setServiceAccount(流)
.setDatabaseUrl(“https://[PROJECT-ID].firebaseio.com/”)
.build();
FirebaseApp.initializeApp(选项);
DatabaseReference ref=FirebaseDatabase.getInstance().getReference();
final TaskCompletionSource tcs=新TaskCompletionSource();
Task tcsTask=tcs.getTask();
ref.addListenerForSingleValueEvent(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
MyBean result=dataSnapshot.getValue(MyBean.class);
如果(结果!=null){
tcs.setResult(结果);
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
//处理错误
}
});
试一试{
mModelClassObject=Tasks.await(tcsTask);
}捕获(执行例外){
//处理异常
}捕捉(中断异常e){
//处理异常
}
返回mModelClassObject;
}
我不知道这是否符合最佳实践,但我的项目正在进行中。 我还包括firebase获取信息的代码。看看我最近在读写firebase时问的一个问题的答案

编辑

已清理的版本不会抛出错误

public class MyEndpoint {

    private FirebaseOptions options;
    private DatabaseReference ref;
    private String serviceAccountJSON = "i took mine out for security reasons";

    // create firebase instance if need be
    private void connectToFirebase(){
        if (options == null) {
            options = null;
            options = new FirebaseOptions.Builder()
                    .setServiceAccount(new ByteArrayInputStream(serviceAccountJSON.getBytes(StandardCharsets.UTF_8)))
                    .setDatabaseUrl("https://[PROJECT-ID].firebaseio.com/")
                    .build();
            FirebaseApp.initializeApp(options);
        }
        if(ref == null) {
            ref = FirebaseDatabase.getInstance().getReference();
        }
    }

    /** A simple endpoint method that takes a name and says Hi back */
    @ApiMethod(name = "sayHi")
    public MyBean sayHi(@Named("name") String name) {

        // always do this first
        connectToFirebase();

        MyBean mModelClassObject = null;

        final TaskCompletionSource<MyBean> tcs = new TaskCompletionSource<>();
        Task<MyBean> tcsTask = tcs.getTask();

        // get the info
        ref.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                MyBean result = dataSnapshot.getValue(MyBean.class);
                if(result != null){
                    tcs.setResult(result);
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError){
                //handle error
            }
        });

        // wait for it
        try {
            mModelClassObject = Tasks.await(tcsTask);
        }catch(ExecutionException e){
            //handle exception
        }catch (InterruptedException e){
            //handle exception
        }

        mModelClassObject.setData(mModelClassObject.getData() + name);

        return mModelClassObject;
    }
}
公共类MyEndpoint{
私人FirebaseOptions;
私有数据库参考文献;
私有字符串serviceAccountJSON=“我出于安全原因取出了我的”;
//如果需要,创建firebase实例
私有void connectToFirebase(){
如果(选项==null){
选项=空;
选项=新的FirebaseOptions.Builder()
.setServiceAccount(新的ByteArrayInputStream(serviceAccountJSON.getBytes(StandardCharsets.UTF_8)))
.setDatabaseUrl(“https://[PROJECT-ID].firebaseio.com/”)
.build();
FirebaseApp.initializeApp(选项);
}
如果(ref==null){
ref=FirebaseDatabase.getInstance().getReference();
}
}
/**一个简单的端点方法,它接受一个名称并返回Hi*/
@ApiMethod(name=“sayHi”)
公共MyBean sayHi(@Named(“name”)字符串名){
//总是先这样做
connectToFirebase();
豆蔻模型
public class MyEndpoint {

    private FirebaseOptions options;
    private DatabaseReference ref;
    private String serviceAccountJSON = "i took mine out for security reasons";

    // create firebase instance if need be
    private void connectToFirebase(){
        if (options == null) {
            options = null;
            options = new FirebaseOptions.Builder()
                    .setServiceAccount(new ByteArrayInputStream(serviceAccountJSON.getBytes(StandardCharsets.UTF_8)))
                    .setDatabaseUrl("https://[PROJECT-ID].firebaseio.com/")
                    .build();
            FirebaseApp.initializeApp(options);
        }
        if(ref == null) {
            ref = FirebaseDatabase.getInstance().getReference();
        }
    }

    /** A simple endpoint method that takes a name and says Hi back */
    @ApiMethod(name = "sayHi")
    public MyBean sayHi(@Named("name") String name) {

        // always do this first
        connectToFirebase();

        MyBean mModelClassObject = null;

        final TaskCompletionSource<MyBean> tcs = new TaskCompletionSource<>();
        Task<MyBean> tcsTask = tcs.getTask();

        // get the info
        ref.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                MyBean result = dataSnapshot.getValue(MyBean.class);
                if(result != null){
                    tcs.setResult(result);
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError){
                //handle error
            }
        });

        // wait for it
        try {
            mModelClassObject = Tasks.await(tcsTask);
        }catch(ExecutionException e){
            //handle exception
        }catch (InterruptedException e){
            //handle exception
        }

        mModelClassObject.setData(mModelClassObject.getData() + name);

        return mModelClassObject;
    }
}