Rafraîchissant jeton OAuth à l'aide de Rénovation sans modifier tous les appels

Nous sommes à l'aide de Rénovation dans notre application Android, pour communiquer avec un OAuth2 serveur sécurisé. Tout fonctionne très bien, nous utilisons la RequestInterceptor pour inclure le jeton d'accès à chaque appel.
Cependant il y aura des moments, lorsque le jeton d'accès expirera, et le jeton doit être actualisé. Quand le jeton arrive à expiration, le prochain appel sera de retour avec une autorisation de code HTTP, donc c'est facile à surveiller.
Nous pourrions modifier chaque Rénovation d'appel de la manière suivante:
Dans le rappel d'échec, vérifiez le code d'erreur, si elle est égale à non autorisée, d'actualiser le jeton OAuth, puis répétez la Rénovation d'appel.
Cependant, pour cela, tous les appels doivent être modifiés, ce qui n'est pas facilement maintenable, et de la bonne solution.
Est-il un moyen de le faire sans modifier tous les de Rénovation des appels?

  • Cela semble pertinent à mon autre question. Je vais regarder de nouveau bientôt, mais une approche possible est d'emballage OkHttpClient. Quelque chose comme ceci: github.com/pakerfeldt/signpost-retrofit Aussi, depuis que je suis en utilisant RoboSpice avec la Rénovation, de la création d'une classe de Requête de base peut être une autre approche possible ainsi. Probablement, vous aurez à comprendre comment obtenir votre flux sans un Contexte bien que, peut-être l'aide d'Otto/EventBus.
  • Je trouve ça aussi étrange, que la Rénovation a été autour pendant un temps assez long, et OAuth2 est également utilisée de méthode d'authentification, et il n'y a pas de ressources sur cette. Panneau Rénovations semble prometteur, avez-vous encore essayé?
  • Non, je pense qu'il n'est plus de ce dont j'ai besoin dans ce cas, comme je ne suis pas intéressé par la signature de la demande. Cependant emballage OkHttpClient comme Panneau-mise à niveau ne semble comme une solution viable, ou au moins un bon point de départ.
  • Eh bien, vous pourriez fourche, et de supprimer les inutiles cas. Je vais regarder dans ce peut-être aujourd'hui, et de poster ici si j'ai obtenu quelque chose qui pourrait résoudre notre problème.
  • J'ai regardé un peu plus profondément en elle, et il s'avère que le panneau ne peut pas gérer jeton rafraîchit. Cependant, j'ai trouvé une API wrapper pour GetGlue, qui utilise la rénovation, et les poignées de jeton actualise (cela utilise aussi une coutume OkHttpClient): github.com/UweTrottmann/getglue-java
  • S'est avéré, que la bibliothèque n'a pas de poignée rafraîchissante jetons, mais m'a donné une idée. J'ai fait un petit résumé sur certains !code non testé, mais en théorie, je pense que cela devrait fonctionner: gist.github.com/ZolnaiDani/9710849
  • Qui semble être dans la bonne direction, la partie la plus délicate serait l'annonce de la nouvelle jetons et la persistance d'eux. C'est là que vous devez obtenir un Contexte à partir de quelque part, ou de l'annoncer avec Otto/EventBus.
  • J'ai mis à jour mon gist. Je vais installer un local serveur OAuth, et de tester des choses, je ne garantis pas le code de travail encore.
  • J'aime bien ton résumé, mais que se passerait-il si deux demandes parallèles échoue sur jeton expiré et à la fois demander à nouveau?
  • Une solution que je pense: faire de la changeTokenInRequest(...) synchronisée, et à la première ligne, vérifiez quand était la dernière fois que le jeton a été actualisé. S'il a été juste quelques secondes (en millisecondes) il y a, ne pas actualiser le jeton. Vous pouvez également définir ce laps de temps de 1 heure, arrêter sans cesse de demander de nouveaux jetons quand il y a un autre problème en dehors du jeton d'être dépassées.
  • L'essentiel s'est déplacé à: gist.github.com/dzolnai/9710849
  • Une façon de le faire en plus de l'extension de OkHttp serait tellement génial.
  • Rénovation 1.9.0 juste ajouté le support pour OkHttp 2.2, qui a intercepteurs. Cela devrait rendre votre travail beaucoup plus facile. Pour plus d'info, voir: github.com/square/retrofit/blob/master/... et github.com/square/okhttp/wiki/Interceptors Vous avez à étendre OkHttp pour ces trop, cependant.
  • Certainement utiliser le nouveau Intercepteur API pour faire quelque chose comme ceci maintenant, si vous êtes en utilisant OkHttp. @DanielZolnai, vous avez réellement n'avez pas à étendre OkHttp faire cela avec une Interceptor. Voir ma réponse ci-dessous.