2016-02-06 3 views
5

J'essaie d'utiliser Retrofit (2.0.0-beta3), mais lorsque j'utilise un Authenticator pour ajouter un token, je n'arrive pas à obtenir les données de l'appel synchrone. Notre journalisation sur le back-end montre juste beaucoup de tentatives de connexion, mais je ne peux pas obtenir les données du corps pour réellement ajouter à l'en-tête. Je ne suis pas trop sûr de savoir pourquoi il n'imprime même pas quoi que ce soit. Tous les conseils sur la façon de résoudre ce problème seraient grandement appréciés, merci d'avoir pris le temps de nous aider.Android - Retrofit 2 - Authentificateur Résultat


Voici les sources que j'ai lues sur la façon d'implémenter Retrofit.

En utilisant Authenticator:

Faire des appels synchrones avec 2 Rénovation:

+1

êtes-vous que le gson est configuré de manière peut comprendre votre classe de session? – gropapa

+1

Appeler emailLogin (...) fonctionne de manière asynchrone, donc je ne pense pas que ce soit un problème avec le gson. Y at-il un moyen facile de dire ce qui ne va pas avec cet appel? Je ne peux pas voir d'erreurs, ou quoi que ce soit. –

Répondre

5

J'ai l'authentificateur semblable et cela fonctionne avec 2.0.0-beta2.

Si vous recevez beaucoup de tentatives de connexion de la part de votre authentifiant, je suggère de vous assurer que lorsque vous effectuez l'appel synchrone, vous n'utilisez pas Authenticator avec cet appel. Cela pourrait se retrouver en boucle, si votre "emailLogin" échoue également.

Aussi, je recommande d'ajouter loggingInterceptor voir tout le trafic vers le serveur: Logging with Retrofit 2

+1

Merci pour votre réponse, et je l'ai eu pour réellement ajouter dans les jetons; cependant, chaque fois que j'essaie d'appeler un autre appel réseau, il fait la même chose, donc je suppose que l'en-tête ne se répercute pas entre les appels. Comment sauvegarder/définir l'en-tête pour chaque appel? –

+1

Je stocke spécifiquement le jeton dans la base de données et ajoute le jeton à l'en-tête "Autorisation" pour tous les appels. ajoutez ceci à vos appels et donnez le jeton comme paramètre: @Header ("Authorization") String bearerToken, –

+1

Donc, je changerais l'appel à "Call getUser (@Header (" Authorization ") Token de chaîne); ", mais chaque fois que je l'appelle, je devrais passer dans le jeton, cela a du sens. Mais y a-t-il une façon plus propre de faire cela? Peut-être utiliser un intercepteur ou en quelque sorte envelopper les fonctions? –

8

J'ai réussi à obtenir une solution décente en utilisant la TokenAuthenticator et un intercepteur et je pensais que je partage l'idée que cela puisse aider d'autres. Ajout de la classe 'TokenInterceptor' qui gère l'ajout du jeton à l'en-tête, le jeton existe, et la classe 'TokenAuthenticator' gère le cas lorsqu'il n'y a pas de jeton, et nous devons en générer un.

Je suis sûr qu'il existe de meilleures façons de mettre en œuvre cela, mais c'est un bon point de départ, je pense.

public static class TokenAuthenticator implements Authenticator { 
    @Override 
    public Request authenticate(Route route, Response response) throws IOException { 
    ... 
    Session body = call.execute().body(); 
    Logger.d("Session token: " + body.token); 
    // Storing the token somewhere. 
    session.token = body.token; 
    ... 
} 


private static class TokenInterceptor implements Interceptor { 
@Override 
    public Response intercept(Chain chain) throws IOException { 
     Request originalRequest = chain.request(); 

     // Nothing to add to intercepted request if: 
     // a) Authorization value is empty because user is not logged in yet 
     // b) There is already a header with updated Authorization value 
     if (authorizationTokenIsEmpty() || alreadyHasAuthorizationHeader(originalRequest)) { 
      return chain.proceed(originalRequest); 
     } 

     // Add authorization header with updated authorization value to intercepted request 
     Request authorisedRequest = originalRequest.newBuilder() 
       .header("Auth-Token", session.token) 
       .build(); 
     return chain.proceed(authorisedRequest); 
    } 
} 

Source:

http://lgvalle.xyz/2015/07/27/okhttp-authentication/