Búsqueda de sitios web

Obtenga un token de acceso para Graph API PowerShell utilizando un código de dispositivo


A veces es necesario realizar tareas mediante programación en su inquilino de Microsoft mediante Microsoft Graph PowerShell, pero es posible que no tenga la opción o no desee instalar el SDK. El SDK no sólo es algo engorroso de instalar, sino que también resulta cada vez más frustrante de mantener.

Afortunadamente, como es fácil acceder a Graph API, puede utilizar las funciones integradas de PowerShell para obtener tokens de acceso y realizar consultas. Sin embargo, esta forma tradicional de hacerlo es utilizar un método de autenticación desatendido, como una clave secreta con un registro de aplicación personalizado. Estas claves secretas a menudo se almacenan dentro de su código, pero también se puede acceder a ellas de forma segura a través de otros medios, como Azure Key Vault.

Otra forma de autenticarse en Microsoft Graph es hacerlo de forma interactiva mediante la autenticación moderna. Desafortunadamente, la experiencia del navegador integrado no está disponible sin instalar el SDK, por lo que para solucionar este problema y obtener una experiencia similar, se puede utilizar el flujo de concesión de autorización del dispositivo para obtener un token de acceso.

En este tutorial, le mostraré cómo puede usar PowerShell, sin instalar el SDK de Microsoft Graph PowerShell, para obtener un token de acceso mediante la autenticación de código de dispositivo.

Iniciar la solicitud de autorización del dispositivo

El primer paso es iniciar el proceso de autorización solicitando un código de usuario y un código de dispositivo al servidor de autenticación. El siguiente código iniciará el proceso. Hay dos parámetros que debes incluir en el cuerpo de tu solicitud, estos son client_id y resource.

  • El client_id es la entidad de servicio (o aplicación) en Microsoft Entra a la que desea conectarse; a continuación, definí la aplicación integrada de herramientas de línea de comandos de Microsoft Graph.
  • El recurso define para qué será válido el token de acceso. En este caso Microsoft Graph.
$ClientID = '14d82eec-204b-4c2f-b7e8-296a70dab67e'
$uri = "https://login.microsoftonline.com/common/oauth2/devicecode"
$body   = @{
    client_id = $ClientId
    resource  = "https://graph.microsoft.com/"
 }
$Request = Invoke-RestMethod -Uri $uri -Method POST -Body $body

Completar el inicio de sesión interactivo

La respuesta a la solicitud de autorización contendrá información pertinente para completar la autenticación. Específicamente, contendrá la URL de verificación a la que deberá navegar y el código de usuario que deberá ingresar en el navegador web antes de iniciar sesión. Puede ver esta información ingresando la variable $Request en su sesión de PowerShell.

Abra su navegador web preferido y navegue hasta: https://microsoft.com/devicelogin. Luego, cuando se le solicite el código, ingrese el código de usuario almacenado en la variable $request y haga clic en Siguiente.

Complete la experiencia de inicio de sesión habitual y luego se le pedirá que cierre la ventana. Una vez hecho esto, regrese a su sesión de PowerShell y continúe con el siguiente paso.

Obteniendo el token de acceso

Ahora que el usuario ha sido autorizado, cualquier aplicación estándar normalmente se configuraría para sondear el punto final /token realizando solicitudes POST utilizando el código del dispositivo para obtener un token de acceso. En cambio, debemos hacer esto manualmente para obtener el token de acceso.

En la siguiente solicitud, realizamos una solicitud POST al punto final /token utilizando el grant_type, device_code requerido. y client_id como se define en la documentación de Microsoft. La respuesta (incluye el token de acceso) se almacena en la variable $token.

$TokenReq = @{
    Method = 'POST'
    Uri    = "https://login.microsoftonline.com/common/oauth2/token"
    Body   = @{
        grant_type = "urn:ietf:params:oauth:grant-type:device_code"
        code       = $Request.device_code
        client_id  = $ClientId
    }
}
$Token = Invoke-RestMethod @TokenReq

Puede comprobar que la respuesta se almacenó correctamente ingresando $token en su sesión de PowerShell.

Usando el token de acceso

Una vez que se obtiene el token de acceso, tendrá una vida útil corta a menos que se actualice. Aunque en términos generales será suficiente para la mayoría de las tareas y lo cubriré en una publicación separada.

El token de acceso se puede definir al inicio de su secuencia de comandos y almacenarse en una variable, lo que permite reutilizarlo para múltiples solicitudes. La forma más sencilla de hacerlo es con el siguiente código.

$header = @{
        'Authorization' = "Bearer $($token.access_token)"
}

Con el cmdlet Invoke-RestMethod, la variable $header se puede incluir con el parámetro -Header para cualquier solicitud. A continuación se muestra un ejemplo en el que invoco una solicitud GET contra el punto final /v1.0/groups.

$header = @{
        'Authorization' = "Bearer $($token.access_token)"
}

$URI = "https://graph.microsoft.com/v1.0/groups"
Invoke-RestMethod -Uri "$URI" -Headers $Header

Entonces debería recibir una respuesta exitosa.

Script completo para obtener un token de acceso para Microsoft Graph usando un código de dispositivo

Para simplificar el proceso, aquí hay un pequeño script que iniciará el flujo de concesión de autorización del dispositivo, luego iniciará su navegador web predeterminado con la URL de verificación y guardará el código de usuario en su portapapeles. Cuando se inicia el navegador, el script se detendrá hasta que vuelva a él. Por último obtendrá el token de acceso listo para ser utilizado.

#Define the ID of the application you wish to connect to. 
#This has been prefilled with the Microsoft Graph Command Line Tools application.
$ClientID = '14d82eec-204b-4c2f-b7e8-296a70dab67e'

#Request a device code
$DeviceCodeRequestParams = @{
    Method = 'POST'
    Uri    = "https://login.microsoftonline.com/common/oauth2/devicecode"
    Body   = @{
        client_id = $ClientId
        resource  = "https://graph.microsoft.com/"
    }
}
$Request = Invoke-RestMethod @DeviceCodeRequestParams

#Copy the device code to your clipboard
Set-Clipboard -Value $Request.user_code

#Launch default web browser at https://microsoft.com/devicelogin
Start-Process $Request.verification_url

#Notice and pause processing, press ENTER to continue
Write-host "`n User code $($Request.user_code) copied to clipboard!... It expires in 15 minutes `n" -ForegroundColor Yellow
Write-host "LAUNCHING WEB BROWSER, please complete the login and click ENTER when complete `n" -ForegroundColor Yellow
pause

#Obtain access token once authenticated
$TokenReq = @{
    Method = 'POST'
    Uri    = "https://login.microsoftonline.com/common/oauth2/token"
    Body   = @{
        grant_type = "urn:ietf:params:oauth:grant-type:device_code"
        code       = $Request.device_code
        client_id  = $ClientId
    }
}
$Token = Invoke-RestMethod @TokenReq

#The token accessible at "$Token.access_token"

Artículos relacionados