Solución de problemas de tokens de acceso de Microsoft Entra ID
En este artículo se describe cómo solucionar los errores que pueden surgir al obtener tokens de acceso de Microsoft Entra ID y cómo validarlos.
No se pudo obtener el token con el nombre de usuario y la contraseña.
Mensaje de error
The user or administrator has not consented to use the application with ID <client-id>.
Send an interactive authorization request for this user and resource.
Solución
- Si el recurso AzureDatabricks no se agrega a la aplicación, pida a un usuario administrador que lo agregue.
- Use el método interactivo para obtener el token. La página web le guiará para conceder permisos a la aplicación. Como alternativa, haga clic en el botón Conceder permisos que se describe en la configuración de la aplicación. Una vez concedidos los permisos, puede usar el método de programación para obtener el token.
Los URI de redirección no coinciden.
Mensaje de error
The reply url specified in the request does not match the reply urls configured for the application: '<application-id>'
Solución
Compruebe que el URI de redirección de la solicitud coincide con uno de los de la aplicación.
Validación de un token de acceso
Cuando tenga un token de acceso Microsoft Entra ID, puede comprobar que incluye la información correcta (véase validar tokens).
Debe comprobar que los campos siguientes coinciden con el registro:
- aud: el identificador del recurso de Azure Databricks:
2ff814a6-3304-4ab8-85cb-cd0e6f879c1d
- iss: debe ser
https://sts.windows.net/<tenant-id>/
- tid: debe ser el inquilino del área de trabajo (busque esto por identificador de organización o identificador de dispositivo del área de trabajo)
- nbf/exp: la hora actual debe estar entre
nbf
yexp
. - unique_name: debe ser un usuario que exista en el área de trabajo de Databricks, a menos que el usuario sea colaborador en el recurso del dispositivo del área de trabajo.
Valide la firma del token mediante los certificados públicos de los puntos de conexión de OIDC.
Este es un fragmento de código que muestra la carga del token. Primero debe instalar la biblioteca PyJWT mediante pip install pyjwt
y la biblioteca de criptografía mediante pip install cryptography
:
import jwt
def decode_token(token):
algorithm = jwt.get_unverified_header(token)['alg']
decoded = jwt.decode(
token,
algorithms = [algorithm],
options = {"verify_signature": False}
)
for key in decoded.keys():
print(f"{key}: {str(decoded[key])}")
Si desea una codificación completa (incluida la comprobación de firma) del token, puede usar el siguiente fragmento de código. Primero debe instalar la biblioteca PyJWT mediante pip install pyjwt
y la biblioteca de criptografía mediante pip install cryptography
. Además, asegúrese de reemplazar <databricks-resource-id>
en el código siguiente:
import jwt
import requests
from cryptography.x509 import load_pem_x509_certificate
from cryptography.hazmat.backends import default_backend
PEMSTART = '-----BEGIN CERTIFICATE-----\n'
PEMEND = '\n-----END CERTIFICATE-----\n'
# Get the Microsoft Azure public key.
def get_public_key_for_token(kid):
response = requests.get(
'https://login.microsoftonline.com/common/.well-known/openid-configuration',
).json()
jwt_uri = response['jwks_uri']
response_keys = requests.get(jwt_uri).json()
pubkeys = response_keys['keys']
public_key = ''
for key in pubkeys:
# Find the key that matches the kid in the token's header.
if key['kid'] == kid:
# Construct the public key object.
mspubkey = str(key['x5c'][0])
cert_str = PEMSTART + mspubkey + PEMEND
cert_obj = load_pem_x509_certificate(bytes(cert_str, 'ascii'), default_backend())
public_key = cert_obj.public_key()
return public_key
# Decode the given <ms-entra-id> token.
def aad_access_token_decoder(access_token):
header = jwt.get_unverified_header(access_token)
public_key = get_public_key_for_token(header['kid'])
# The value of the databricks_resource_id is as defined previously,
# for example, databricks_resource_id = "2ff814a6-3304-4ab8-85cb-cd0e6f879c1d"
decoded = jwt.decode(
access_token,
key = public_key,
algorithms = 'RS256',
audience = '<databricks-resource-id>')
for key in decoded.keys():
print(f"{key}: {str(decoded[key])}")
Este es un ejemplo de la salida del fragmento de código anterior:
También puede ver el token descodificado a través de descodificadores JWT en línea si no son confidenciales. Algunos ejemplos de descodificadores en línea son jwt.ms y jwt.io.