web-dev-qa-db-fra.com

Exception 10 de l'API Google SignIn

Approche de la dernière étape de l'authentification, mais quelque chose ne va pas dans la méthode handleSignInResult. Il renvoie le code d'exception 10 (erreur développeur) dans les journaux. Google fournit une description complète:

L'application est mal configurée. Cette erreur n'est pas récupérable et sera traitée comme fatale. Le développeur est un idiot ...

Que dois-je faire pour gérer cela (obtenir un compte) et enfin récupérer les valeurs du compte?
Merci d'avance pour votre aide!!!

Activité principale:

package ru.podgorny.carcall;

import ...

public class MainActivity extends AppCompatActivity {

        SignInButton signInButton;
        public static final int RC_SIGN_IN = 07;
        public static final String TAG = "MainActivity";
        TextView tw1;
        TextView tw2;


        GoogleSignInOptions gso;
        GoogleSignInClient mGSC;


        @Override
        protected void onCreate (Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(TAG, "Activity Works");
        findViews();

            gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                    .requestEmail()
                    //.requestProfile()
                    .build();

            mGSC = GoogleSignIn.getClient(this, gso); //smth with mGSC variable....

             View.OnClickListener onClickListener = new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    onClick2(v);
                }
            };
             signInButton.setOnClickListener(onClickListener);




    }

    private void findViews() {
            Log.d (TAG, "findViews started");
        signInButton = findViewById(R.id.idButtonGoogle);

        tw1 = findViewById(R.id.textView1);
        tw1 = findViewById(R.id.textView2);

        Log.d(TAG, "Views finded");


    }

    public void onClick2(View view) {
            Log.d(TAG, "onClick started");
        switch (view.getId()) {
            case R.id.idButtonGoogle:
                signIn();
                break;
        }
        Log.d(TAG, "OnClick Started");
    }

    public void signIn() {

        Intent signInIntent = mGSC.getSignInIntent();
        startActivityForResult(signInIntent, RC_SIGN_IN);
        Log.d(TAG, "startActivityForResult works");

    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Log.d(TAG, "OnActivityResult started");
        // Result returned from launching the Intent from GoogleSignInClient.getSignInIntent(...);
        if (requestCode == RC_SIGN_IN) {
            // The Task returned from this call is always completed, no need to attach
            // a listener.
            Log.d(TAG, "TASK started");
            Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
            handleSignInResult(task);
            Log.d(TAG, "OnActivityResult returned");
        }
    }

    private void handleSignInResult(Task<GoogleSignInAccount> completedTask) {
        try {
            GoogleSignInAccount account = completedTask.getResult(ApiException.class);//ERROR -- Code 10
            Log.d(TAG, "Account received");


            updateUI(account);
            Log.d(TAG, "updateUI Launched");
        } catch (ApiException e) {

            Log.w(TAG, "signInResult:failed code=" + e.getStatusCode());
            updateUI(null);
        }
    }

    private void updateUI(GoogleSignInAccount account) {
            if (account!=null) {
                tw1.setText("OK");
                tw2.setText("Name: " + account.getGivenName() + ", Family name: " + account.getFamilyName() + ", Email: " + account.getEmail() /*+ " image: " +
                        account.getPhotoUrl()*/);
            }else {
                tw1.setText("SMTH wrong");
            }

        }

}
9
max podgorny

Cette erreur peut se produire si vous n'utilisez pas le même projet dans console.developers.google et console.firebase.google.com. Si le projet est le même sur les deux consoles, assurez-vous d'avoir correctement ajouté votre clé SHA1. Obtenez SHA1 à partir de Android studio.

  1. Ouvrez Android Studio
  2. Ouvrez votre projet
  3. Cliquez sur Gradle (dans le panneau de droite, vous verrez la barre Gradle)
  4. Cliquez sur Actualiser (Cliquez sur Actualiser dans la barre Gradle, vous verrez la liste des scripts Gradle de votre projet)
  5. Cliquez sur votre projet (liste du formulaire de nom de votre projet (racine))
  6. Cliquez sur Tâches
  7. Cliquez sur Android
  8. Double-cliquez sur la signature du rapport (vous obtiendrez SHA1 et MD5 dans la barre d'exécution (parfois ce sera dans la console Gradle))
  9. Sélectionnez le module d'application dans la liste déroulante de sélection de module pour exécuter ou déboguer votre application. Vous devez également obtenir google-services.json à partir de la console Firebase et l'intégrer dans votre projet.
17
Patrick R

J'ai atterri dans le même problème et perdu des heures. En creusant plus profondément dans OAuth et OpenId, j'ai compris la raison. Nous faisons ici une erreur conceptuelle.

Pour Android ou toute autre plate-forme (à l'exception du Web), vous devez créer au moins deux types d'ID client dans le même projet de la console API Google. Ces types d'ID client sont les suivants:

  1. Application Web
  2. Android

Vous pouvez les créer dans n'importe quel ordre. Lors de la création Android tapez l'ID client, vous devez donner le nom du package et SHA1. Lors de la création de l'ID d'application Web, il vous suffit de donner un nom.

Vous n'avez rien d'autre à faire avec ces identifiants jusqu'à ce que vous vouliez vérifier l'utilisateur de votre backend. En d'autres termes, si vous souhaitez que votre serveur d'arrière-plan interroge le serveur Google sur les informations de cet utilisateur, seul vous aurez besoin de l'ID d'application Web. Le flux conceptuel est le suivant:

  1. Envoyez d'abord l'ID du client d'application Web à partir de Android App au serveur de connexion Google comme option supplémentaire en utilisant requestIdToken (your_web_app_client_id).
  2. Vous récupérerez un jeton dans l'application Android lors de la connexion de l'utilisateur.
  3. Envoyez ce jeton à votre backend.
  4. Votre serveur principal peut désormais échanger ce jeton avec les serveurs Google pour obtenir les informations de l'utilisateur

Envoyez cet ID client d'application Web depuis Android App vers le serveur principal.

Utilisez cet ID d'application Web si vous souhaitez vérifier l'utilisateur sur votre serveur principal.

1
Shyam Swaroop

Je voudrais ajouter des informations supplémentaires sur pourquoi la réponse @Patrick R (ci-dessus fonctionne/marquée comme correcte). Pour exécuter votre projet/pratique, la console Google doit identifier votre application via la clé SHA-1 lorsqu'elle est distribuée sur Google Play Market, Cependant, lorsque vous expérimentez simplement avec la confirmation de connexion et la preuve de concept, puis il associe la clé de débogage SHA-1 (votre application la génère automatiquement) à cette fin précise, en gardant vos modifications de test et de production modulaires.

1