2012-09-20 23 views
9

Estoy jugando con la aplicación DriveCommandLine para aprender un poco la API de Drive. Me pregunto si es posible autenticar mi aplicación de escritorio con Google Drive sin que el usuario tenga que copiar/pegar un código de autenticación del navegador. ¿Pero solo tienes que devolver un token a la aplicación desde el navegador? Puedo hacer esto con la API de Dropbox y con la API de la Lista de Documentos de Google, pero no puedo encontrar la manera de hacerlo funcionar con la API de Google Drive.¿Cómo autenticar Google Drive sin requerir que el usuario copie/pegue código de autenticación?

Gracias.

Google Drive API - aplicación de ejemplo DriveCommandLine (ligeramente modificada):

public class DriveCommandLine { 

    private static String CLIENT_ID = APPCONSTANTS.Google.CONSUMER_KEY; 
    private static String CLIENT_SECRET = APPCONSTANTS.Google.CONSUMER_SECRET; 

    private static String REDIRECT_URI = "urn:ietf:wg:oauth:2.0:oob"; 

    public static void main(String[] args) throws IOException, URISyntaxException { 
    HttpTransport httpTransport = new NetHttpTransport(); 
    JsonFactory jsonFactory = new JacksonFactory(); 

    GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
     httpTransport, jsonFactory, CLIENT_ID, CLIENT_SECRET, Arrays.asList(DriveScopes.DRIVE)) 
     .setAccessType("offline") 
     .setApprovalPrompt("force").build(); 

    String url = flow.newAuthorizationUrl().setRedirectUri(REDIRECT_URI).build(); 
    System.out.println("Enter authorization code:"); 
    Desktop.getDesktop().browse(new URI(url)); 
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
    String code = br.readLine(); 

    GoogleTokenResponse response = flow.newTokenRequest(code).setRedirectUri(REDIRECT_URI).execute(); 
    GoogleCredential credential = new GoogleCredential().setFromTokenResponse(response); 

    //Create a new authorized API client 
    Drive service = new Drive.Builder(httpTransport, jsonFactory, credential).build(); 
} 

Google API de lista de documentos:

public void authenticate(){ 
      GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters(); 
      oauthParameters.setOAuthConsumerKey(APPCONSTANTS.Google.CONSUMER_KEY); 

      OAuthSigner signer; 
      if (APPCONSTANTS.Google.USE_RSA_SIGNING) { 
        signer = new OAuthRsaSha1Signer(APPCONSTANTS.Google.CONSUMER_SECRET); 
      } else { 
       oauthParameters.setOAuthConsumerSecret(APPCONSTANTS.Google.CONSUMER_SECRET); 
       signer = new OAuthHmacSha1Signer(); 
      } 

      GoogleOAuthHelper oauthHelper = new GoogleOAuthHelper(signer); 

      oauthParameters.setScope(APPCONSTANTS.Google.SCOPES); 

      oauthHelper.getUnauthorizedRequestToken(oauthParameters); 

      String requestUrl = oauthHelper.createUserAuthorizationUrl(oauthParameters); 

      Desktop desktop = Desktop.getDesktop(); 
      URI url = new URI(requestUrl); 
      desktop.browse(url); 

      String token = oauthHelper.getAccessToken(oauthParameters); 
    } 
+0

¿Qué valores 'redirect_uri' usa para cada una de estas opciones? ¿Estás usando los mismos flujos? –

+0

Agregué mi código de cómo me autentico con la API de la Lista de Documentos de Google al OP. – PseudoPsyche

Respuesta

6

El comando muestras de línea fueron escritos por simplicidad, no necesariamente la mejor experiencia de usuario . En este caso, se están ejecutando como aplicaciones locales y están utilizando el flujo de aplicaciones instaladas para OAuth 2.0. Ese flujo tiene un modo donde redirect_uri puede apuntar a localhost, pero requiere iniciar un servidor web temporal para recibir el redireccionamiento. En lugar de complicar la muestra, utiliza el modo OOB que requiere copiar/pegar el código.

Si está creando una aplicación de escritorio, le recomiendo ir por la ruta de redirigir a localhost ya que es una mejor UX.

Consulte https://developers.google.com/accounts/docs/OAuth2InstalledApp para obtener más información.

+0

¡Gracias! ¡Eso es exactamente lo que estaba buscando! – PseudoPsyche

+0

Bien, pero ¿cómo puedo obtener un nuevo token de acceso usando el token de actualización almacenado sin llamar a una nueva Autorización? No está especificado en Java ... – Aerox

0

Cambie su redirect_uri a su página localhost o página de proyecto.La solicitud en el enlace provisto tendrá su código enviado. La solicitud tendrá code = "yourauthcode" en su url. Ejemplo: https://yourwebsite.com/yourpage.htm?code= "yourauthcode"

6

Paso 1: Generar la URL utilizando el tipo de acceso sin conexión

flow = new GoogleAuthorizationCodeFlow.Builder(
httpTransport, jsonFactory, CLIENT_ID, CLIENT_SECRET, Arrays.asList(DriveScopes.DRIVE)) 
.setAccessType("offline") 
.setApprovalPrompt("auto").build(); 
String url = flow.newAuthorizationUrl().setRedirectUri(REDIRECT_URI).build(); 

Paso 2: almacenar las credenciales accessToken y refreshToken

GoogleTokenResponse response = flow.newTokenRequest(code).setRedirectUri(REDIRECT_URI).execute(); 
      GoogleCredential credential = new GoogleCredential.Builder().setTransport(httpTransport) 
       .setJsonFactory(jsonFactory) 
       .setClientSecrets(CLIENT_ID, CLIENT_SECRET) 
       .build() 
       .setFromTokenResponse(response); 
String accessToken = credential.getAccessToken(); 
String refreshToken = credential.getRefreshToken(); 

Paso 3: fichas de reutilización cuando necesario

GoogleCredential credential1 = new GoogleCredential.Builder().setJsonFactory(jsonFactory) 
.setTransport(httpTransport).setClientSecrets(CLIENT_ID, CLIENT_SECRET).build(); 
credential1.setAccessToken(accessToken); 
credential1.setRefreshToken(refreshToken); 
Drive service = new Drive.Builder(httpTransport, jsonFactory, credential1).build(); 

Paso 4: Debajo soportar OAuth para manejar los errores y la actualización de los tokens

+1

¿Dónde obtenemos el 'código' (como en' flow.newTokenRequest (code) 'en el paso 2?) – michaelsnowden

Cuestiones relacionadas