Android java: анонимный вход через Firebase всегда дает сбой - PullRequest
0 голосов
/ 04 октября 2018

Я работал с firebase, чтобы загружать изображения из базы данных Firebase в реальном времени в RecyclerView, а затем загружать выбранное изображение в телефон из Firebase Storage.Я не хочу, чтобы каждый мог видеть изображения, только если он вошел в систему с использованием метода анонимного входа в методе, поэтому я создал правила хранения следующим образом:

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read : if request.auth != null;
    }
  }
}

Правила базы данных:

{
  "rules": {
    ".read": true,
    ".write": false
  }
}

Я сделал это, это сработало на моем первом приложении.Я хотел сделать 2-й, поэтому я скопировал все, переименованные имена баз данных и имена хранилищ ... но в журнале я получаю это:

error getting token java.util.concurrent.ExecutionException: com.google.firebase.internal.api.FirebaseNoSignedInUserException: Please sign in before trying to get a token.

E/StorageException: StorageException has occurred.
    User does not have permission to access this object.
     Code: -13021 HttpResult: 403
    Could not open resulting stream.
    java.io.IOException: Could not open resulting stream.

Код, который я использовал для анонимного входа:

private void signInAnonymously() {
        mAuth.signInAnonymously().addOnSuccessListener(this, new OnSuccessListener<AuthResult>() {
            @Override
            public void onSuccess(AuthResult authResult) {
                Log.e("TAG", "success sign");
                // do your stuff
            }
        })
                .addOnFailureListener(this, new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception exception) {
                        Log.e("TAG", "failed sign");
                    }
                });
    }

    @Override
    protected void onStart() {
        super.onStart();
        sign();
    }

    private void sign() {
        mAuth = FirebaseAuth.getInstance();
        FirebaseUser user = mAuth.getCurrentUser();
        if (user != null) {
            Log.e("TAG", "already sign");
        } else {
            signInAnonymously();
            Log.e("TAG", "sign null");
        }
        //loadIntAdd();
    }

Код, который я использовал для загрузки выбранного изображения:

StorageReference  sr = mStorageRef.child("images/img" +selected_img_num + ".png");
                    sr.getBytes(1024 * 1024).addOnSuccessListener(new OnSuccessListener<byte[]>() {
                        @Override
                        public void onSuccess(byte[] bytes) {
                          //I save the image here
                        }
                    }).addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            Toast.makeText(final_treatement.this, R.string.oper_failed, Toast.LENGTH_LONG).show();
                            finish();
                        }
                    });

Мои зависимости:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support:cardview-v7:27.1.1'
    implementation 'com.android.support:recyclerview-v7:27.1.1'
    implementation 'com.google.firebase:firebase-database:16.0.1'
    implementation 'com.google.firebase:firebase-core:16.0.3'
    implementation 'com.squareup.picasso:picasso:2.71828'
    implementation 'com.firebaseui:firebase-ui-database:0.4.0'
    implementation 'com.google.android.gms:play-services-ads:15.0.1'
    implementation 'com.google.firebase:firebase-storage:16.0.2'
    implementation 'com.google.firebase:firebase-auth:16.0.3'
}

apply plugin: 'com.google.gms.google-services'

Мой файл манифеста:

   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

    <application
        android:allowBackup="true"
        android:hardwareAccelerated="true"
        android:icon="@drawable/appicon"
        android:label="@string/app_name"
        android:largeHeap="true"
        android:roundIcon="@drawable/appicon"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".choose_image">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".final_treatement"/>

обратите внимание, что я активировал анонимный вход в консоль Firebase

Я не знаю, почему это работало раньше и не удалось здесь

Пожалуйста, ответьте, если что-то отсутствует

Ответы [ 2 ]

0 голосов
/ 28 июля 2019

Возможно, проблема не в вашем коде, убедитесь, что вы включили анонимный вход из консоли Firebase. Шаги:

  1. Перейдите в раздел Аутентификация в консоли Firebase.
  2. ВыберитеМетоды входа на вкладку
  3. Включить последнюю опцию «Аноним»
  4. Все готово:)
0 голосов
/ 04 октября 2018

Вы получаете эту ошибку, потому что вы пытаетесь получить доступ к файлу, пока вы еще не аутентифицированы.Поскольку правила безопасности Firebase Storage разрешены только для аутентифицированных пользователей, серверы Firebase отказывают в вашей попытке.Чтобы решить эту проблему, сначала убедитесь, что вы прошли аутентификацию, а затем получите нужные вам изображения.Помните, что метод onCreate() вызывается раньше onStart(), в соответствии с жизненным циклом действия .

...