2012-07-24 18 views
7

El nuevo Drive SDK es muy bueno para el usuario autenticado. ¿Es posible usar Drive SDK usando el acceso administrativo de Google Apps para hacerse pasar por otros usuarios del dominio?¿Puede un administrador de Google Apps administrar archivos de usuarios con Drive SDK?

La API doclist puede hacerlo pero no es posible administrar y copiar archivos (pdf, jpg) con esta herramienta.

estoy usando Java con este código:

credential_origine = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT) 
        .setJsonFactory(JSON_FACTORY) 
        .setServiceAccountId("[email from console api]") 
        .setServiceAccountScopes(DriveScopes.DRIVE) 
        .setServiceAccountUser("[email protected]") 
        .setServiceAccountPrivateKeyFromP12File(new File("key.p12")).build(); 

pero me da un error al intentar recuperar los datos para el [email protected] Si digo .setServiceAccountUser("[email protected]"), el código funciona muy bien para la misma cuenta que utilicé para crear la clave.

En la antigua API de DOCList suplantamos a otro usuario por la URL de las solicitudes. ¿Es algo similar?

+0

¿Qué error estás obteniendo?Asegúrese de agregar el ID de cliente generado desde la Consola de API en el panel de cPanel de su dominio como se describe [aquí] (http://support.google.com/a/bin/answer.py?hl=es&answer=162106). – Alain

+0

Hola Alain, funciona bien ahora, probablemente me equivoqué con ServiceAccountUser. Obtengo un 500 Internal Server Error cuando trato de cambiar el propietario de un archivo con updatePermission y patchPermission ... tal vez porque un archivo debe tener un propietario ... Lo intentaré de nuevo, gracias por la ayuda – Ridgh

+0

@Ridgh puedes dar Tengo alguna idea sobre el acceso a los documentos de los usuarios mediante el SDK de administración. Actualmente estoy trabajando en los documentos de los usuarios –

Respuesta

4

Puede hacerlo utilizando Service Accounts y especificando que el usuario debe suplantar al crear su afirmación de afirmación.

Una vez que haya creado una clave de Cuenta de servicio en su proyecto API (desde APIs Console), tendrá que agregar este proyecto a la lista de aplicaciones de terceros autorizadas en cPanel. Se puede encontrar más información sobre esto en here. El "ID de cliente" tiene que utilizar es el de un salto a la clave de cuenta de servicio y se parece a <APP_ID>-<OTHER_KEY>.apps.googleusercontent.com

Desde desea administrar presentar otros usuarios, tendrá que autorizar a la unidad de amplio alcance: https://www.googleapis.com/auth/drive.

La mayoría de nuestras bibliotecas de clientes se encargan de abstraer la generación de reclamos para los desarrolladores. Si puede especificar qué idioma está planeando usar, puedo actualizar esta respuesta proporcionando un fragmento de código para ayudarlo a comenzar.

+0

¿Hay una biblioteca de Ruby para lograr esto? – tbeseda

+0

La biblioteca de clientes de Google para Ruby no es compatible con las cuentas de servicio: https://code.google.com/p/google-api-ruby-client/wiki/ServiceAccounts – Alain

0

actualización:

el código:

com.google.api.client.googleapis.auth.oauth2.GoogleCredential.Builder credential_origine_builder = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT) 
        .setJsonFactory(JSON_FACTORY) 
        .setServiceAccountId("[[]]") 
        .setServiceAccountScopes(DriveScopes.DRIVE) 
        .setServiceAccountPrivateKeyFromP12File(new File("cfg/file.p12")); 

credential_origine_builder.setServiceAccountUser("[email protected]"); 

funciona bien.

Si cambiamos el .setServiceAccountScopes(DriveScopes.DRIVE) a

.setServiceAccountScopes(DriveScopes.DRIVE,Oauth2Scopes.USERINFO_EMAIL,Oauth2Scopes.USERINFO_PROFILE) 

para recuperar el nombre y el ID del usuario parece no ser compatible con .setServiceAccountUser("[email protected]");

El uso de los 3 ámbitos funciona bien sólo con el usuario "propietario "de las teclas ... seguir construyendo

+0

¿Otorgó esos ámbitos adicionales cuando configuró el acceso oAuth en el cpanel? Desde la ayuda de Google cpanel: para cada cliente, puede especificar múltiples API, separadas por comas. Por ejemplo, para permitir el acceso a las API de Contactos y de la Lista de documentos: "http://www.google.com/m8/feeds/, http://docs.google.com/feeds/" – David

+0

David, en mi código Estoy seguro de que agregué los ámbitos, en la consola de Google Api no veo este ámbito. ¿Estoy equivocado? Utilicé la configuración de grupos api más la API de aprovisionamiento y el flujo web de oauth 2.0 correctamente. Mi pregunta es sobre doclist api + drive api y la cuenta de servicio Oauth flow ... Espero usar solo drive sdk pero no es posible gestionar los permisos (el campo de correo electrónico no se devuelve para privacidad) .. – Ridgh

0

bien aquí es el código completo en Dartlang para listar los archivos de usuario @ your_domain usuario suplantado con JSON clave

para ejecutarlo tendrá que generar la clave JSON (en lugar de P12) a través de Google Developer Console (en el contexto del proyecto: Apis & auth -> credenciales) generate JSON key

dependencias

de DART en pubspec.yaml: googleapis googleapis_auth asíncrono)

import 'package:googleapis/drive/v2.dart'; 
import 'package:googleapis_auth/auth_io.dart'; 
import 'package:async/async.dart'; 

final _credentials = new ServiceAccountCredentials.fromJson(r''' 
{ 
    "private_key_id": "*PRIVATE_KEY_ID*", 
    "private_key": "*PRIVATE_KEY_CONTENT*", 
    "client_email": "*[email protected]*", 
    "client_id": "*SOMETHING.apps.googleusercontent.co*m", 
    "type": "service_account" 
} 
''', impersonatedUser: "*[email protected]_DOMAIN*"); //here you type user 

const _SCOPES = const [DriveApi.DriveScope]; 

main() async { 
    var http_client = await clientViaServiceAccount(_credentials, _SCOPES); 
    var drive = new DriveApi(http_client); 
    var docs = await drive.files.list(maxResults: 10); 

    for (var itm in docs.items) { 
    print(itm.title); //list docs titles 
    } 
} 
Cuestiones relacionadas