Hacemos una verificación profunda cada tutorial en nuestro espacio con la meta de mostrarte siempre la información certera y actual.
Solución:
Logré hacerlo. No estoy seguro de si es la mejor manera, pero está funcionando ahora. Se ejecuta automáticamente cada hora y no necesito tocarlo.
Seguí la información en https://docs.microsoft.com/en-gb/azure/active-directory/develop/v2-oauth2-auth-code-flow
Esto es lo que hice.
Portal azur
- Cree una aplicación. Azure Active Directory -> Registros de aplicaciones -> Aplicaciones de cuenta personal
- En Tipos de cuenta admitidoselige el que tiene cuentas personales de microsoft.
- En URI de redirecciónelegir Cliente público/nativo. Agregaremos el URI específico más adelante.
- En los detalles de la aplicación, en la sección Visión generaltoma nota de la ID de la aplicación (cliente). Necesitaremos esto más tarde.
- En la sección Autenticaciónhaga clic Agregar una plataforma y elige Escritorio + dispositivos. Puedes usar el tuyo, elegí uno de los sugeridos: https://login.microsoftonline.com/common/oauth2/nativeclient
- En la sección permisos de la API, debe agregar todos los permisos que usará su aplicación. yo añadí Usuario.Leer, Archivos.ReadWrite y acceso_sin_conexión. los acceso_sin_conexión es poder conseguir el token de actualizaciónque será crucial para mantener la aplicación en funcionamiento sin pedirle al usuario que inicie sesión.
- yo no creé ninguno Certificado o Secreto.
Web
Parece que para obtener un token por primera vez tenemos que usar un navegador o emular algo así.
Debe haber una forma programática de hacer esto, pero no tenía idea de cómo hacerlo. También pensé en usar Selenium para esto, pero dado que es solo una vez y mi aplicación solicitará tokens cada hora (manteniendo los tokens actualizados), descarté esa idea.
Si agregamos nuevos permisos, los tokens que tenemos dejarán de ser válidos y tendremos que hacer esta parte del manual nuevamente.
- Abra un navegador y vaya a la URL a continuación. Utilizar el Ámbitos y el URI de redirección que configuró en Azure Portal.
https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=your_app_client_id&response_type=code&redirect_uri=https%3A%2F%2Flogin.microsoftonline.com%2Fcommon%2Foauth2%2Fnativeclient&response_mode=query&scope=User.Read% 20offline_access%20Files.ReadWrite
Esa URL se redirigir tu a la URI de redirección que configuraste y con un código=alguna cosa en la URL. Entendido alguna cosa.
- Realice una solicitud POST con tipo FORM URL Codificado. Usé https://reqbin.com/ para esto.
punto final: https://login.microsoftonline.com/common/oauth2/v2.0/token
URL del formulario: grant_type=authorization_code&client_id=your_app_client_id&code=use_the_code_returned_on_previous_step
Esto devolverá un token de acceso y un token de actualización. Guarde el token de actualización en algún lugar. Lo estoy guardando en un archivo.
Pitón
# Build the POST parameters
params =
'grant_type': 'refresh_token',
'client_id': your_app_client_id,
'refresh_token': refresh_token_that_you_got_in_the_previous_step
response = requests.post('https://login.microsoftonline.com/common/oauth2/v2.0/token', data=params)
access_token = response.json()['access_token']
new_refresh_token = response.json()['refresh_token']
# ^ Save somewhere the new refresh token.
# I just overwrite the file with the new one.
# This new one will be used next time.
header = 'Authorization': 'Bearer ' + access_token
# Download the file
response = requests.get('https://graph.microsoft.com/v1.0/me/drive/root:' +
PATH_TO_FILE + '/' + FILE_NAME + ':/content', headers=header)
# Save the file in the disk
with open(file_name, 'wb') as file:
file.write(response.content)
Básicamente, tengo el Refresh Token siempre actualizado.
Llamo al extremo del token usando ese token de actualización y la API me proporciona un token de acceso para usar durante la sesión actual y un nuevo token de actualización.
Uso este nuevo token de actualización la próxima vez que ejecuto el programa, y así sucesivamente.
Si entiendes que ha sido de provecho este artículo, sería de mucha ayuda si lo compartieras con más juniors de este modo contrubuyes a dar difusión a esta información.