0

Mon projet est un projet java spark que j'ai hébergé sur heroku. Une partie du projet nécessite que je télécharge un fichier particulier de mon disque google dans l'application. J'ai réussi à tout configurer lorsque mon application était en cours d'exécution mais dès que j'ai déployé l'application, elle a cessé de fonctionner. C'était indépendamment du fait que lorsque l'application était en cours d'exécution, j'ai utilisé un ID client Oauth2 de type autre et lorsque j'ai déployé l'application, j'ai créé un nouveau type d'application web.google drive Oauth 2.0 pour l'application web java

Voici un extrait de l'authentification et code de téléchargement:

public class AutoCalls { 

    /** Application name. */ 
    private static final String APPLICATION_NAME = "calls-made"; 
    private static final java.io.File DATA_STORE_DIR = new java.io.File(System.getProperty("target/classes/auth"), ".credentials/calls-made"); 
    private static FileDataStoreFactory DATA_STORE_FACTORY; 
    private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance(); 
    private static HttpTransport HTTP_TRANSPORT; 
    private static final List<String> SCOPES = Arrays.asList(DriveScopes.DRIVE); 

    static { 
     try { 
      HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); 
      DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR); 

     } catch (GeneralSecurityException | IOException t) { 
      System.exit(1); 
     } 
    } 

    public static void startDownload() throws IOException, ParseException { 

     Drive serv = getDriveService(); 
    // drive stuff deleted 
    } 

    public static Credential authorize() throws IOException { 
     InputStream in = new FileInputStream("target/classes/auth/client_secret_*****************************************.apps.googleusercontent.com.json"); 
     GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); 
     GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) 
      .setDataStoreFactory(DATA_STORE_FACTORY) 
      .setAccessType("offline") 
      .build(); 
     Credential credential = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); 
     System.out.println("Credentials saved to " + DATA_STORE_DIR.getAbsolutePath()); 
     return credential; 
    } 

    public static Drive getDriveService() throws IOException { 
     Credential credential = authorize(); 

     return new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential) 
      .setApplicationName(APPLICATION_NAME) 
      .build(); 
    } 
} 

Actuellement lorsque je tente de lancer le téléchargement, je reçois une URL dans le Heroku enregistre un suit:

2017-02-20T10:32:28.656820+00:00 app[web.1]: Please open the following address in your browser: 
2017-02-20T10:32:28.656908+00:00 app[web.1]: https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=************-vvdi7u6bmp1vc90sdidtnuiftdi1t49c.apps.googleusercontent.com&redirect_uri=http://localhost:48085/Callback&response_type=code&scope=https://www.googleapis.com/auth/drive 

Quand je essayez d'ouvrir l'URL dans un navigateur Je reçois une erreur:

Error: redirect_uri_mismatch 

Je ne trouve pas de bon tutorat étape par étape ial sur l'accès au contenu du disque google sur une application web java afin que toute aide soit arreiciated.

Répondre

0

Généralement, si OAuth fonctionne sur le serveur A mais pas sur le serveur B, c'est parce que l'URL de redirection n'a pas été configurée correctement sur la console API. Il n'y a aucune raison de devoir utiliser un ID client différent, car un seul ID client peut être configuré avec plusieurs URL, par exemple votre hôte local et votre serveur heroku. Une autre possibilité est l'utilisation de https.

Il existe un problème distinct dans votre code où vous effectuez une itération sur lista.isEmpty(). Vous devriez itérer sur nextPageToken != null. Voir la réponse à Google drive rest API, Download files from root folder only

+0

Est-ce que le fait que j'utilisais l'application localement l'ai déplacé à Heroku n'a pas d'implication? Je demande parce que les ID de client peuvent être pour des applications Web et autres (pour les applications de bureau, qui n'ont pas d'URL de redirection par exemple) etc. L'ID client qui fonctionnait était de type autre et n'acceptait donc pas les URL de redirection. – Chognificent

+0

Je ne comprends pas pourquoi vous avez changé le type de client. Votre application doit sûrement être la même dans les tests que dans la production. L'approche standard consiste donc simplement à avoir un seul identifiant de client avec des URL de redirection pour votre environnement de test et votre environnement de production. Soit j'ai mal compris ce que vous essayez de réaliser, soit vous avez mal compris les types d'OAuth/client quelque part en cours de route. – pinoyyid

+0

J'ai changé mon type de client parce que celui que j'utilisais (autre) ne permettait pas une URL de redirection et ne fonctionnait donc pas. – Chognificent