3

J'ai une application Java qui doit permettre aux utilisateurs d'autoriser l'accès de ma demande aux services Google. Je le bit de code suivant en place pour montrer et obtenir l'autorisation dont j'ai besoin:Googles AutorisationCodeInstalledApp.authorize() méthode de blocage de l'autorisation annulée

GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(httpTransport, JsonFactory, clientSecrets, scopes).build(); 
Credential cred = null; 
try 
    { 
    LocalServerReceiver localSrv = new LocalServerReceiver(); 

    AuthorizationCodeInstalledApp app = new AuthorizationCodeInstalledApp(flow, localSrv); 

    cred = app.authorize(userName); 
    } 
    catch(Exception ex) 
    { 
    ex.printStackTrace(); 
    } 
    refreshToken = cred.getRefreshToken(); 

Si l'utilisateur clique sur les boutons « Authorize » ou « Annuler » tout va bien. Cependant, s'ils ferment la fenêtre du navigateur, l'application entière se fige. Y at-il un moyen de gérer ce cas pour éviter le gel ou introduire un délai d'attente?

+0

Que signifie «congélation»? Pas de réponse? –

+0

Le processus se bloque et l'application entière devient non-réactif. Même Eclipse ne peut pas le tuer à ce stade, mais le processus doit être terminé manuellement. – ChargerIIC

+0

Si c'est la même chose que je vois, l'appel à app.authorize() fait un Thread.wait() jusqu'à ce que le code d'autorisation soit redirigé depuis la page de connexion. Si la page de connexion est fermée, alors ce code d'authentification ne sera jamais renvoyé, alors l'application apparaîtra figée, mais en fait elle attend. Malheureusement, je ne sais pas encore quelle est la solution pour cela. –

Répondre

1

Nous intégrons également Google Drive à notre application, et c'est une de mes préoccupations. Qu'est-ce qui se passe est que si vous appelez la méthode authorize(), quel que soit le fil sur lequel l'appel est bloqué. Vous remarquerez que pendant que la fenêtre d'autorisation est ouverte, l'application n'est pas non plus réactive. J'espérais qu'il y aurait un moyen de détecter si l'utilisateur fermait la fenêtre d'autorisation, mais il semble que cela ne fera qu'attendre le LocalServerReceiver sans fin pour un jeton qui n'arrivera jamais.

Votre meilleur pari à ce stade est appelez authorize() de façon asynchrone, et d'attendre une réponse. Edit: J'ai jeté un coup d'œil sur le code source LocalServerReceiver car nous voulions que le récepteur redirige vers une URL différente plutôt que d'afficher du texte brut. Il implémente l'interface VerificationCodeReceiver, qui a une méthode de blocage waitForCode(). Il semble qu'il soit nécessaire pour AuthorizationCodeInstalledApp.authorize() de bloquer en attendant, même si vous faites votre propre implémentation de VerificationCodeReceiver.

+0

Maintenant que j'ai plus d'expérience de programmeur sous ma ceinture, je suis forcé d'être d'accord. C'est vraiment dommage que ce ne soit pas non-bloquant. – ChargerIIC

Questions connexes