2011-05-05 33 views
10

Estoy trabajando en la conversión de un script de Python usando el API de gdata de Google + autenticación de usuario/pase a algo más adecuado para la producción (una clave de API). Estoy bastante frustrado con el estado confuso de su documentación sobre autenticación. Es cierto que no tengo una gran comprensión de OAuth2, pero parece que es mucho más complicado para mi caso de uso, que es: acceder a Google Analytics cada 24 horas para obtener los X artículos más populares en nuestro sitio.gdata-python-api + Análisis con auth simple

En este caso, no estamos tratando de modificar los datos personales de otra persona, y toda la actividad se centra en una sola cuenta. No parece que OAuth2 valga la complejidad de algo tan simple.

Veo que en la consola de la API de Google (https://code.google.com/apis/console/), me he registrado allí y veo que hay una sección de "Acceso simple a la API" con una clave debajo del "ID de cliente para aplicaciones web" (que parece ser OAuth2). También está la página de actualización de dominio de Google, https://www.google.com/accounts/UpdateDomain, pero que parece estar relacionada con OAuth.

¿Hay alguna forma de utilizar esta clave de acceso API simple (no OAuth) para recuperar datos analíticos con el cliente Python gdata, y si es así, ¿alguien tiene algún ejemplo de autenticación? Ya tengo las cosas de recuperación de datos una vez autenticadas, pero estoy usando el enfoque de usuario/pase, que no es apropiado para la producción.

+0

Estoy de acuerdo que esto es realmente frustrante, estoy en el mismo barco ahora. El caso de uso de OAuth2 realmente no tiene sentido si solo está utilizando sus propios datos y no necesita autenticarse con cuentas de usuario. Así que estoy confundido también sobre por qué están moviendo muchas apis. Por lo que entiendo OAuth1 funciona sin esta idea de una url de devolución de llamada? Preferiría usar también la clave simple de la API, pero no está claro si esto ha quedado obsoleto y en qué api.Esperemos que Google lo arregle pronto! –

+0

Han pasado 6 meses desde esta pregunta, ¿alguien ha encontrado una respuesta? Acabo de hacer 2 preguntas muy similares aquí http://stackoverflow.com/questions/8263776/how-to-use-oauth-with-google-calendar-to-access-only-one-calendar y aquí http: // stackoverflow .com/questions/8270994/how-do-i-use-googles-simple-api-access-key-to-access-google-calendar-info-ph y mi problema es el mismo: no necesito acceder calendario de otra persona, necesito acceder solo a UNA. Entonces, la clave de desarrollador debería ser el camino a seguir, pero no puedo encontrar ningún tutorial en línea o ejemplos. ¿Alguien puede ayudar? – Joel

+1

También probé la simple https://www.googleapis.com/analytics/v3/management/accounts/XXXXX/webproperties/UA-XXXXX-1/profiles?pp=1&key={YOUR-KEY-HERE} con cero éxito. Creo que necesitas OAuth incluso si son tus propios datos = (. Me encantaría ver una solución a esta pregunta – DougA

Respuesta

12

Greg,

Si ya está utilizando la biblioteca gdata-python-client, esto es relativamente fácil de hacer si usted es el único usuario que la aplicación se autoriza.

Los mecanismos generales se detallaron en un blog post en septiembre de 2011, pero los describiré aquí para completarlos.

Parte 1: vaya al APIs console y comience un nuevo proyecto.

Parte 2: Desde el proyecto, vaya a "Servicios" y permitir "Analytics API"

Parte 3: Desde el proyecto, vaya a "Acceso a la API" y haga clic en "Crear una OAuth 2.0 ID de cliente ... "(deberá proporcionar un nombre de producto, aunque el valor que proporcione no importará). Cuando se le solicite el tipo de aplicación, seleccione "Aplicación instalada" y luego "Crear ID de cliente". Como usted será el único usuario, solo necesitará un token de actualización, y puede obtenerlo autorizando desde una aplicación de escritorio una sola vez.

Parte 4: Obtenga su ID de cliente y el secreto de cliente de la consola de las API y luego crear un token vacío:

import gdata.gauth 

CLIENT_ID = 'id-from-apis-console' 
CLIENT_SECRET = 'secret-from-apis-console' 
SCOPE = 'https://www.google.com/analytics/feeds/' # Default scope for analytics 

token = gdata.gauth.OAuth2Token(
    client_id=CLIENT_ID, 
    client_secret=CLIENT_SECRET, 
    scope=SCOPE, 
    user_agent='application-name-goes-here') 

llegué el alcance de GData FAQ, aunque no estoy seguro de si es correcto.

Parte 5: utilizar el token para crear URL de autorización para visitar:

url = token.generate_authorize_url(redirect_uri='urn:ietf:wg:oauth:2.0:oob') 

Debido a que su aplicación es una "aplicación instalada", el URI de redireccionamiento es el valor predeterminado 'urn:ietf:wg:oauth:2.0:oob'. (También tenga en cuenta que la publicación del blog tenía un error tipográfico y utilizó la palabra clave argumento redirect_url.)

Parte 6: Visite la url y autorice su solicitud para realizar solicitudes en nombre de su cuenta. Después de autorizar, serás redirigido a una página con un código. Este código se usará para intercambiar por un token de acceso y un token de actualización de larga duración. El código tiene una vida útil de 10 minutos y el token de acceso tiene una duración de una hora. El token de actualización le permitirá obtener nuevos tokens de acceso para firmar solicitudes a perpetuidad (o hasta que revoke el permiso de su cuenta).

Parte 7: Utilice el código para obtener un token de acceso:

code = 'random-string-from-redirected-page' 
token.get_access_token(code) # This returns the token, but also changes the state 

De nuevo, esto difiere ligeramente de la entrada del blog, porque estamos usando una aplicación instalada.

Parte 8: Con el token que ahora puede hacer que todas las solicitudes que desee realizar en el cliente de análisis:

import gdata.analytics.client 

client = gdata.analytics.client.AnalyticsClient() 
token.authorize(client) 

Este es el gran dinero aquí. Cuando un token de acceso caduca, las solicitudes de API firmadas con ese token son rechazadas. Sin embargo, al autorizar al cliente como se indica anteriormente, cuando dichas solicitudes fallan, el token intenta utilizar el token de actualización para obtener un nuevo token de acceso. Si obtiene con éxito un nuevo token de acceso, el cliente reenvía la solicitud original de la API, firmada con el nuevo token de acceso.

No sé nada sobre la API de Analytics, así que no proporcionaré más detalles allí.

Uso futuro Nota 1: Guardando información para usos futuros. Puede volver a utilizar esto desde diferentes lugares y después de este uso muy fácilmente. Hay métodos llamados token_to_blob y token_from_blob proporcionados por la biblioteca que permite convertir un token en una cadena y la conversión de una cadena:

saved_blob_string = gdata.gauth.token_to_blob(token) 

Una vez hecho esto, se puede almacenar la cadena en un archivo y matar a su ejecutando el proceso de Python. Cuando desea volver a utilizarlo:

saved_blob_string = retrieve_string_from_file() # You'll need to implement this 
token = gdata.gauth.token_from_blob(saved_blob_string) 

Uso Futuro Nota 2: Esta señal podrá ser utilizado para autorizar a un cliente y llevar a cabo toda su magia una y otra vez, siempre y cuando tenga el token de actualización alrededor. Si por alguna razón usted desea obtener un nuevo token de acceso sin llamar token.generate_authorize_url, tendrá que configurar manualmente esta en el objeto:

token.redirect_uri = 'urn:ietf:wg:oauth:2.0:oob' 

Uso Futuro Nota 3: También, si pierde su actualización token y le gustaría conseguir otro sin tener que ir al navegador para revoke el original, puede utilizar el parámetro approval_prompt para obtener un nuevo token de actualización en la siguiente URL generada por:

url = token.generate_authorize_url(
    redirect_uri='urn:ietf:wg:oauth:2.0:oob', 
    approval_prompt='force') 
+0

Sé que esto se publicó hace un año, pero también estoy siguiendo este proceso y me pregunto por qué " La API de sitios no aparece en la consola API. ¿No es compatible la API de sitios? – cemulate

+0

Existe una diferencia entre las API de GData y las API basadas en Discovery. La API de sitios es una API de GData, mientras que solo las API basadas en Discovery están en la consola . Ver http://stackoverflow.com/questions/ 13981641 para algunos comentarios sobre la distinción. – bossylobster