Authentification de l'API Firebase Rest d'Android

je suis en train de développer une application utilisant la base de données en temps réel Firebase, cependant j'ai choisi d'omettre l'utilisation du SDK pour récupérer des données à partir de la base de données. La raison étant que je ne veux pas que mon code soit si étroitement lié avec FireBase qu'une fois l'application construite, l'api elle-même se déplacera vers une api personnalisée basée sur rest.

j'ai implémenté les appels api en utilisant REST avec Firebase comme dans les docs sans problème-POST, GET, DELETE etc..

le problème que j'ai est si j'autorise n'importe quel type de authentification sur la base de données, selon les docs je dois envoyer "access_token" avec la demande mais je ne sais pas où le récupérer. firebaseUser.getToken(true) renvoie ce qui semble être un token JWT qui n'est pas reconnu si je l'envoie comme "access_token". J'obtiens 401 Unauthorized

j'ai aussi suivi les instructions pour configurer un compte de service qui semble générer un token qui fonctionne mais qui n'identifie pas uniquement l'utilisateur.

ma question est donc est-ce que n'importe qui peut m'indiquer comment obtenir le token d'accès requis qui identifie quel utilisateur accède à cette api? Les options de connexion que mon projet Firebase prend en charge sont Google, Facebook et Twitter.

15
demandé sur crazyfool 2017-03-14 08:27:49

2 réponses

si vous recherchez les différents tokens ou id de chacun des différents modes d'authentification, vous devez implémenter des API différences pour chacun d'eux:

REST API

Pour récupérer un jeton d'accès, vous devez utiliser un compte de service. Merci consultez le guide D'utilisation des comptes Google Service. Vous pouvez créer un justificatif de compte de service dans votre projet Firebase du Service Section Comptes de la console Firebase.

à titre d'exemple, une façon de générer un token OAuth2 approprié est avec le client Java google-api.

GoogleCredential googleCred = GoogleCredential.fromStream(new FileInputStream("service_account.json"));
GoogleCredential scoped = googleCred.createScoped(
    Arrays.asList(
      "https://www.googleapis.com/auth/firebase.database",
      "https://www.googleapis.com/auth/userinfo.email"
    )
);
scoped.refreshToken();
String token = scoped.getAccessToken();

une demande acceptée sera indiquée par un 200 OK code de statut HTTP. La réponse contient les données récupérées:

{ "first": "Jack", "last": "Sparrow" }

L'API de repos de la base de données Accepte access_token=<TOKEN> sur la chaîne de requête ou d'en-tête Authorization: Bearer <TOKEN> pour authentifier une demande avec un compte de service.

L'exemple suivant montre comment vous pouvez utilisez ceci avec une base de données contenant les noms d'utilisateur. Vous devez remplacer [PROJECT_ID] avec l'identifiant de votre Firebase projet.

Facebook

Vous devez ajouter le Facebook SDK à votre application et implémenter un LoginButton et LoginManager éléments en demandant certains renseignements public_profile un e-mail. C'est assez ennuyeux de travailler avec Facebook SDK. Voici un exemple de code pour l'ajouter:

// Initialize Facebook Login button
mCallbackManager = CallbackManager.Factory.create();
LoginButton loginButton = (LoginButton) findViewById(R.id.button_facebook_login);
loginButton.setReadPermissions("email", "public_profile");
loginButton.registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() {
    @Override
    public void onSuccess(LoginResult loginResult) {
        Log.d(TAG, "facebook:onSuccess:" + loginResult);
        handleFacebookAccessToken(loginResult.getAccessToken());
    }

    @Override
    public void onCancel() {
        Log.d(TAG, "facebook:onCancel");
        // ...
    }

    @Override
    public void onError(FacebookException error) {
        Log.d(TAG, "facebook:onError", error);
        // ...
    }
});

aussi, à l'intérieur de la les développeurs de la console à partir de Facebook vous devez créer un compte, configurer un nouveau projet avec le nom du paquet de votre application et ajouter les clés SHA pour déboguer et libérer les versions de votre application. Après avoir fait toutes ces choses, vous récupérerez avec succès un token de LoginResult objet à l'aide de la méthode getAccessToken()

vous pouvez lire plus à ce sujet dans le documents officiels.

Google

Google est plus facile car il est déjà connecté à Firebase, vous devriez ajouter à votre gradle google play servicesgoogle services JSON fichier déjà configuré pour votre application. Vous pouvez l'obtenir à partir de votre console firebase.

après cela, vous devrez configurer un GoogleSignInOptions élément à l'aide de l'id de votre fichier JSON:

// Configure Google Sign In
        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken(getString(R.string.default_web_client_id))
                .requestEmail()
                .build();

Après cela, vous aurez juste besoin de faire l'intention de l' GoogleSignInApi dans votre application et attendez que le onActivityResult rappel:

private void signIn() {
        Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
        startActivityForResult(signInIntent, RC_SIGN_IN);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
        if (requestCode == RC_SIGN_IN) {
            GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
            if (result.isSuccess()) {
                // Google Sign In was successful, authenticate with Firebase
                GoogleSignInAccount account = result.getSignInAccount();
                firebaseAuthWithGoogle(account);
            } else {
                // Google Sign In failed, update UI appropriately
                // ...
            }
        }
    }

après cela, vous pourrez récupérer le token de L'élément GoogleSignInAccount. N'oubliez pas de configurer les différentes touches SHA pour déboguer ou libérer les versions de votre application ou Google vous connecter cessera de fonctionner dans la version release.

vous pouvez lire plus à ce sujet dans le documentation officielle Firebase

Twitter

A propos de twitter, Je n'ai pas travaillé avec Twitter, donc je ne peux pas vraiment vous aider pour le moment, mais je vous suggère de vérifier le Twitter de la documentation du développeur et Twitter firebase la mise en œuvre post.

j'essaierai d'éditer ceci quand je ferai quelques COP à la maison en vérifiant comment ça marche.

à Propos de Firebase jetons

un autre bon point à connaître est les tokens Firebase id, qui sont uniques par utilisateur et connexion dans votre application, vous permettant de vérifier si le même compte essaie de se connecter à partir de différents appareils en même temps, ou envoyer FCM cloud messages pour utiliser la notification en ligne dans votre application.

à la récupérer, vous devez utiliser le FirebaseInstanceId objet à l'aide de l'API et de la méthode FirebaseInstanceId.getInstance(). Cela vous permettra de récupérer un identifiant unique FirebaseInstance pour votre utilisateur lorsqu'il se connecte dans votre application.

Vous pouvez récupérer son jeton idInstance.getToken() et le stocker quand vous voulez dans votre application pour le vérifier et le gérer de la manière que vous voulez.

Firebase de la documentation sur ce n'est pas assez clair, alors je vous recommande d'utiliser la prochaine lien, il m'a beaucoup aidé à le mettre en œuvre dans mon application.

Bonne chance et bon codage, n'hésitez pas à demander plus de choses si je peux vous aider!

7
répondu Francisco Durdin Garcia 2017-03-23 12:23:19

vous pouvez ajouter une table dans votre serveur pour L'utilisateur. Dans cette table, ajoutez des champs comme firebase_token, google_token, fb_token, etc. Comme vous vous enregistrez dans tous ces services un par un, mettez à jour les champs dans le tableau pour l'utilisateur. De cette façon, vous pouvez maintenir le users_info ainsi que tous les jetons.

0
répondu saDashiv sinha 2017-03-23 06:19:14