React-native google signin выдает ошибку разработчика

Я пытаюсь войти в Google с помощью плагина React-native-google-signin, но он выдает ошибку Developer_Error. Я сделал точно так же, как указано в его документе. Вот мой код и шаги.

1.Установлен плагин react-native-google-signin с помощью npm i react-native-google-signin. 2.Затем связали его с реакцией на нативную ссылку 3. После этого я настроил файл build.gradle, как они упоминают в документах.

    ext {
        buildToolsVersion = "27.0.3"
        minSdkVersion = 16
        compileSdkVersion = 27
        targetSdkVersion = 26
        supportLibVersion = "27.1.1"
        googlePlayServicesAuthVersion = "15.0.1"
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.2' 
        classpath 'com.google.gms:google-services:3.2.1' 
    }
    allprojects {
        repositories {
                mavenLocal()
                google() 
                maven {url "https://maven.google.com"}
                jcenter()
                maven {
                // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
                url "$rootDir/../node_modules/react-native/android"
                }
                maven {
                    url 'https://maven.google.com/'
                    name 'Google'
                }
        }
    }

4.Обновлен android/app/build.gradle,

    dependencies {

        implementation 'com.facebook.android:facebook-android-sdk:4.34.0'
        implementation project(':react-native-fbsdk')
        compile project(':react-native-vector-icons')
        compile project(':react-native-fused-location')
        compile project(':react-native-fs')
        compile project(':react-native-image-resizer')
        compile project(':react-native-geocoder')
        compile project(':react-native-device-info')
        compile project(':react-native-image-picker')
        compile fileTree(dir: "libs", include: ["*.jar"])
        compile "com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}"
        compile "com.facebook.react:react-native:+"  // From node_modules
        implementation project(":react-native-google-signin")
        compile (project(':react-native-maps')){
            exclude group: "com.google.android.gms" 
        }
        implementation 'com.google.android.gms:play-services-auth:15.0.1'
        implementation 'com.google.android.gms:play-services-maps:15.0.1'
        implementation 'com.google.android.gms:play-services-location:15.0.1'
        implementation 'com.google.android.gms:play-services-base:15.0.1' 

    }

    task copyDownloadableDepsToLibs(type: Copy) {
        from configurations.compile
        into 'libs'
    }
    apply plugin: 'com.google.gms.google-services' 

5. Затем сгенерируйте ключ SHA1 с помощью android studion debug.keystore и сгенерируйте файл google-services.json в firebase.

6. Затем настройте страницу login.js следующим образом.

    async componentDidMount() {
        this._configureGoogleSignIn();

    }
    _configureGoogleSignIn() {
        GoogleSignin.configure({
            webClientId: '775060548127-5nfj43q15l75va9pfav2jettkha7hm2a.apps.googleusercontent.com',// my clientID
            offlineAccess: false
        });
    }
    async GoogleSignin() {
    try {
        await GoogleSignin.hasPlayServices();
        const userInfo = await GoogleSignin.signIn();
        // this.setState({ userInfo, error: null });
        Alert.alert("success:" + JSON.stringify(userInfo));

    } catch (error) {
        if (error.code === statusCodes.SIGN_IN_CANCELLED) {
            // sign in was cancelled
            Alert.alert('cancelled');
        } else if (error.code === statusCodes.IN_PROGRESS) {
            // operation in progress already
            Alert.alert('in progress');
        } else if (error.code === statusCodes.PLAY_SERVICES_NOT_AVAILABLE) {
            Alert.alert('play services not available or outdated');
        } else {
            Alert.alert('Something went wrong', error.toString());
            this.setState({
                error,
            });
        }
    }
}

Это мои данные, поэтому, пожалуйста, помогите мне в этом, я не могу найти подходящее решение в Интернете. И да, мои SHA1 и clientID верны, я уже проверил это.

Вы нашли решение ?

oma 06.05.2019 19:59

еще нет сети, у вас есть какое-нибудь решение, поделитесь им со мной

Aniruddh Thakor 07.05.2019 11:02

Нет, я получаю ту же ошибку... не понимаю... должна быть базовая интеграция...

oma 07.05.2019 11:09

Используете ли вы firebase для серверной части?

Shehan Dhaleesha 13.05.2019 11:55

Для меня он пытался войти через симулятор, но он работал на физическом устройстве.

Asleepace 27.08.2019 00:06
22
5
33 547
16
Перейти к ответу Данный вопрос помечен как решенный

Ответы 16

Ответ принят как подходящий

У меня тоже была эта проблема, и я просмотрел множество ответов, в которых говорилось, что проверьте идентификатор вашего клиента и хэш ключа, оба из которых, как я был уверен, были правильными.

У меня это заработало: я открыл идентификаторы OAuth в консоли управления проектом (не Firebase) в https://console.cloud.google.com/apis/credentials и добавил идентификатор клиента Android Oauth с правильной подписью (по какой-то причине у меня не было ни одного из них раньше). Повторно загрузите JSON-файл GoogleServices.

Мне также нужно было установить для webClientId значение «client_type»: 3 Идентификатор клиента Oauth. Тогда это сработало.

Вы можете объяснить; «Мне также нужно было установить для webClientId значение «client_type»: 3 идентификатора клиента Oauth. Тогда это сработало». ?

ronnyrr 30.08.2020 22:44

Я немного не уверен, что это было некоторое время назад, но в моем файле google-services.json у меня есть oauth_client, где один из объектов содержит «client_type», равный 3. Я предполагаю, что имел в виду использование «client_id» в этом файл, где "client_type" === 3

user37309 31.08.2020 04:44

Хм, хорошо. Спасибо за ответ. У меня он работает в режиме разработки, но все равно ломается из-за ошибки разработчика в производственной сборке React Native :(

ronnyrr 31.08.2020 13:48

@ronnyrr убедитесь, что при создании подписанного apk для производства вы указываете правильное расположение хранилища ключей. Псевдоним и пароль по умолчанию: androiddebugkey /android

Swaprks 17.11.2020 08:51

Это просто из-за того, что ваш androidClientId не соответствует вашему проекту консоли Google.

  1. создайте новый идентификатор клиента аутентификации из консоли API вашего проекта: https://console.developers.google.com/apis/credentials

  2. обновить конфигурацию до: myfile.js, например:

GoogleSignin.configure({ androidClientId:'YOUR CLIENT ID' )}

Для нативных проектов React:

В контрольном списке есть много пунктов, чтобы избавиться от DEVELOPER_ERROR. Кажется, существует много путаницы в том, где нужно установить ключ SHA-1.

После того, как вы создали android client_id в консоли разработчика Google, у вас есть возможность установить ключ SHA-1 и имя пакета.

Вы можете получить имя пакета из AndroidManifest.xml (projPath/android/app/src/main/AndroidManifest.xml) и установить его в текстовом поле в консоли разработчика Google (очень важно проверять наличие опечаток).

Затем извлеките свой ключ SHA-1 из debug.keystore, используя следующую команду, для которой пароль «android»

Сначала выясните местоположение хранилища ключей:

Ваше приложение может выбирать из

     `pathToReactNativeProj/projName/android/app/debug.keystore`

или: ~/.android/debug.keystore

Затем извлеките свой ключ SHA-1 из debug.keystore, используя следующую команду, для которой пароль — android.

keytool -exportcert -alias androiddebugkey -keystore pathToKeyStore -list -v

скопируйте и вставьте сгенерированный ключ SHA-1. Это должно решить проблему.

Код выглядит следующим образом:

try {
      GoogleSignin.configure(
      {
        //webClientId is required if you need offline access
        offlineAccess: true,
        webClientId:'2423432-43234234232432423234.apps.googleusercontent.com',
        androidClientId: '3242343242322432-2342323432232324343323.apps.googleusercontent.com',
        scopes: ['profile', 'email']
      });
      await GoogleSignin.hasPlayServices();
      console.info("reached google sign in");
      const userInfo = await GoogleSignin.signIn();
      console.info(userInfo);
      this.setState({ userInfo });
    } catch (error) {
      if (error.code === statusCodes.SIGN_IN_CANCELLED) {
        console.info("error occured SIGN_IN_CANCELLED");
        // user cancelled the login flow
      } else if (error.code === statusCodes.IN_PROGRESS) {
        console.info("error occured IN_PROGRESS");
        // operation (f.e. sign in) is in progress already
      } else if (error.code === statusCodes.PLAY_SERVICES_NOT_AVAILABLE) {
        console.info("error occured PLAY_SERVICES_NOT_AVAILABLE");
      } else {
        console.info(error)
        console.info("error occured unknow error");
      }
    }

Путаница вокруг ключа firebase SHA-1:

Установка этого ключа не требуется для получения информации о пользователе из Google. Если вы не используете firebase для хранения данных пользователей, полученных из Google, вам не нужно об этом беспокоиться.

keytool -exportcert -alias androiddebugkey -keystore pathToKeyStore -list -v, эта команда выдает ошибку keytool error: java.lang.Exception: Only one command is allowed: both -exportcert and -list were specified., поэтому я использовал без -exportcert keytool -keystore app/debug.keystore -list -v
Yuji 08.12.2020 14:51

Я думаю, что иногда старый отпечаток пальца (от другого разработчика в прошлом) может конфликтовать. Так что SHA1 должен быть правильным. Удалите старый SHA-1 и повторно загрузите google-services.json.

Я пробовал keytool -exportcert -keystore ~/.android/debug.keystore -list -v, который, конечно же, давал мне ключ SHA1, но он не работал, после некоторого поиска я также заглянул в свою папку project/android/app и обнаружил, что там тоже есть ключ debug.keystore (чей пароль по умолчанию — android, в случае некоторые должны знать) поэтому я попробовал cd android и команду keytool -exportcert -keystore app/debug.keystore -list -v, и ключ, который я получил, работал очень хорошо. Надеюсь, это поможет.

Спасибо, это сработало! Мне пришлось добавить конкретный ключ для приложения, а не тот, который находится в ~/.android

knobiDev 10.06.2020 18:25

Люблю тебя... Спасибо... :)

Natheeshkumar Rangasamy 21.03.2021 17:29

Я получил: «Разрешена только одна команда: были указаны и -exportcert, и -list».

Steven Matthews 08.04.2021 17:20

Я поставил свои 3 дня, но мне это не удалось, но ваш ответ помог мне, спасибо, братан

Ahsan Abrar 22.09.2021 10:56

этот комментарий работает для меня. сначала у меня был собственный файл хранилища ключей, и сгенерированный из него отпечаток SHA1 не работал, затем я изменился, чтобы сгенерировать отпечаток из по умолчанию debug.keystore, теперь он работает.

Franky Kraisorn 18.10.2021 15:03

Большое спасибо, вы только что сэкономили много моего времени!

shift66 22.11.2021 13:42

В моем случае мой ключ SHA-1, который я добавил в проект firebase, недействителен, потому что я получил его от /Users/apple/.android/debug.keystore.

Правильный SHA-1 должен находиться в папке android внутри примера проекта: /Users/apple/Documents/Project/testGoogleFirebaseLogin/android/app/debug.keystore (testGoogleFirebaseLogin — это имя папки моего проекта)

Итак, самый удобный способ — cd android && ./gradlew signingReport. Он сгенерирует много-много строк данных, прокрутите вниз и найдите SHA-1 из того, у которого есть Store: (your project path).

ПРИМЕЧАНИЕ. Не тот, у которого есть Store: /Users/apple/.android/debug.keystore.

(Извините за мое знание английского, я буду признателен, если кто-нибудь исправит мою грамматику и сделает этот ответ более легким для чтения)

Спасибо. Это исправило мою проблему. Мне нужно было загрузить новый ключ с нового устройства.

Aung Myint Thein 27.10.2020 04:50

Для тех, кто все еще ищет решения:

  1. Пожалуйста, сопоставьте свой отпечаток ключа в консоли Firebase.

  2. Не инициализируйте конфигурацию ключами, повторюсь, не предоставляйте никаких объектов конфигурации в функции .configure() Сделайте это GoogleSignIn.configure().

  3. Пункт 2 решит проблему. :)

Добавьте значение ключа SHA1 в файл google-services.json. Для этого откройте google-services.json файл в любом текстовом редакторе и добавьте

"certificate_hash": "5e8f16062ea3cd2c4a0d547876baa6f38cabf625"

с вашим значением хеша без двоеточия (:) в android_client_info

Демонстрационный файл google-services.json

{
  "project_info": {
    "project_number": "108005055433",
    "firebase_url": "https://se-ai-camera.firebaseio.com",
    "project_id": "demo-app",
    "storage_bucket": "demo-app.appspot.com"
  },
  "client": [
    {
      "client_info": {
        "mobilesdk_app_id": "1:108005055433:android:323bf88853cd2899872618",
        "android_client_info": {
          "package_name": "com.myapp",
          "certificate_hash": "5e8f16062ea3cd2c4a0d547876baa6f38cabf625"
        }
      },
      "oauth_client": [
        {
          "client_id": "108005055433-q748qmcrn9a3j4qmg9srrkbotvr4emh1.apps.googleusercontent.com",
          "client_type": 3
        }
      ],
      "api_key": [
        {
          "current_key": "AIzaSyAuGCMQoW0tM7QMhpAgMIi0sK3vj0Nj8lk"
        }
      ],
      "services": {
        "appinvite_service": {
          "other_platform_oauth_client": [
            {
              "client_id": "108005055433-q748qmcrn9a3j4qmg9srrkbotvr4emh1.apps.googleusercontent.com",
              "client_type": 3
            }
          ]
        }
      }
    }
  ],
  "configuration_version": "1"
}

или добавьте ключ SHA1 в настройки приложения (консоль firebase) и загрузите обновленный файл google-services.json.

Затем измените параметр метода GoogleSignIn.configure() на пустой. Это самый важный шаг.

Прохождение для разных режимов:

Разработка Firebase

  1. запустить cd android && ./gradlew signingReport.
  2. Скопируйте хэш SHA-1 и вставьте его в консоль firebase в разделе Android в настройках проекта.
  3. Загрузите файл google-services.json из настроек Firebase и вставьте файл в android/app.
  4. Используйте clientId client_type: 3 клиента внутри config.

Разработка без Firebase

  1. запустить cd android && ./gradlew signingReport.
  2. Скопируйте хэш SHA-1
  3. Перейдите к Консоль облачной платформы Google и нажмите Create Credentials -> OAuthClientID. Выберите тип Android, вставьте хэш и заполните форму.
  4. Создайте еще один клиент, нажав Create Credentials, но на этот раз выберите тип Web application.
  5. Используйте веб-клиент в своем коде

Производственная/Релизная версия

  1. Перейдите в консоль Google Play и скопируйте ключ SHA-1 с Release -> Setup -> App Integrity.
  2. Перейдите к Консоль облачной платформы Google и нажмите Create Credentials -> OAuthClientID. Выберите тип Android, вставьте хэш и заполните форму.
  3. Создайте еще один клиент, нажав Create Credentials, но на этот раз выберите тип Web application.
  4. Используйте веб-клиент в своем коде

Это единственное решение, которое сработало для меня. Обязательно выполните шаг 1 в разделе «Производственная/выпускная версия». Я провел все выходные, пытаясь понять, почему не удается войти в систему только при загрузке приложения из PlayStore.

glocore 01.11.2021 14:25

Это сработало!! Я довольно долго боролся с этой проблемой и, по-видимому, использовал неправильный SHA1. Команда ./gradlew signingReport показывает, что именно использовать для какой сборки. Спасибо!

Pila 08.01.2022 23:10

Я тоже застрял в этой ситуации, когда публиковал свое первое приложение. Документация React Native рассказывает о создании хранилища ключей. Но поскольку я использовал firebase для аутентификации Google, в настройках проекта необходимо указать sha этого хранилища ключей.

Чтобы получить SHA1 из сгенерированного хранилища ключей, выполните следующие команды:

cd android
cd app

keytool -list -v -keystore {keystore-name}.keystore -alias {alias-name}

Теперь запросит пароль. введите пароль, который вы создали при создании хранилища ключей. Он распечатает все детали, и здесь вы можете найти SHA1. Скопируйте отпечаток SHA1 и добавьте в консоль firebase> настройки проекта> приложение для Android.

Люди, которые используют Firebase для входа в Google

Я публикую этот ответ, потому что я пробовал много методов, и только это работало нормально для меня. Проблема возникает из-за того, что в RN версии 0.61 был представлен новый debug.keystore. Из-за этого затрагиваются существующие/новые проекты.

Чтобы решить эту проблему,

  1. Создайте новый ключ отладки Android в папке android/app. Перейдите в корневую папку вашего приложения для реагирования и выполните приведенную ниже команду.

keytool -list -v -keystore ./android/app/debug.keystore -alias androiddebugkey -storepass android -keypass android

После запуска вышеуказанной команды в терминале отобразится SHA1. Скопируйте это.

  1. Перейдите в свой проект firebase.console и на вкладке General в project settings вставьте скопированный SHA1 и сохраните его.

Сделанный. Теперь запустите приложение, и оно должно работать нормально.

Для получения дополнительной информации https://github.com/react-native-google-signin/google-signin/issues/823

Убедитесь, что вы добавили отладочные и выпускные отпечатки пальцев в настройках проекта firebase.

В противном случае создайте отпечатки ключей отладки и выпуска с помощью app/build.gradle -> signingConfigs -> debug.

$ keytool -list -v -keystore android/app/debug.keystore -alias androiddebugkey -storepass android -keypass android


$ keytool -list -v -keystore android/app/release.keystore -alias androidrelease-aliaskey -storepass android -keypass android

затем скопируйте отпечатки sha1/sha256 и добавьте их в project settings -> firebase.

проблема для меня заключалась в использовании webClientID без androidClientID.

  • webClientID: в google-services.json => "client_type": 3

  • androidClientID: в google-services.json => "client_type": 1 Затем в вашем файле js:

     GoogleSignin.configure({
          androidClientId:
    "something.apps.googleusercontent.com",
          webClientId:
     "something.apps.googleusercontent.com",
     });
    

В React Native есть 2 типа хранилищ ключей:

  • debug.keystore: только для отладки.
  • yourownkeystore.keystore: это для производства. и вам нужно его создать. проверьте эту ссылку, чтобы узнать, как: https://reactnative.dev/docs/signed-apk-android

пока в производстве. при создании yourownkeystore.keystore. вы получите определенный SHA-1, который будет использоваться для производства. возьмите это для yourownkeystore.keystore и замените его в консоли firebase вашего проекта. затем повторно загрузите файл google-services.json и замените его в своем приложении android/app. затем получите clientID и androidID из этого файла json и поместите их в конфигурацию вашего метода подписи Google в js.

Вы спасли мою жизнь. для тех, кто использует генерацию Keystore через Android-студию ".jks", вы можете перейти по этим ссылкам Отпечаток SHA-1 сертификата хранилища ключей, чтобы сгенерировать свой SHA1. Еще раз спасибо

Micessien 07.10.2021 16:28

попробуй это, не использовать webClientId и offlineAccess: true

 GoogleSignin.configure({
     ClientId:
        '48774575517-o9j0crni6shsal3jnoerm1o19pdqkg05.apps.googleusercontent.com',
      
    });

мне это помогло, и я не использую firebase, googlePlayServicesAuthVersion = "15.0.1", classpath 'com.google.gms: google-services: 3.2.1', ничего такого

просто я устанавливаю

  1. npm i @react-native-google-signin/google-signin
  2. cd android и gradlew clean

Теперь запустите приложение, и оно должно работать нормально.

Для решения этой проблемы необходимо установить @react-native-google-signin/google-signin

и следуйте этому:

Другие вопросы по теме