Android Firebase服务帐户凭据Json读取权限被拒绝
我从Firebase控制台下载了我的服务帐户凭据json文件,当我在本地运行我的备份时,我将该文件放在了GAE端点项目的主目录中,它给出了安全异常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我找到了两种
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;
}
}