Solucionar problemas de tokens de acesso do Microsoft Entra ID
Este artigo descreve como solucionar erros que você pode encontrar ao obter tokens de acesso do Microsoft Entra ID e como validar tokens de acesso.
Falha ao obter token usando nome de usuário e senha
Mensagem de Erro
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.
Solução
- Se o recurso AzureDatabricks não for adicionado ao seu aplicativo, peça a um usuário Admin para adicioná-lo.
- Use o método interativo para obter o token. A página da Web irá guiá-lo para conceder permissões ao aplicativo. Como alternativa, clique no botão Conceder permissões descrito na configuração do aplicativo. Depois que as permissões forem concedidas, você poderá usar o método programático para obter o token.
Os URIs de redirecionamento não correspondem
Mensagem de Erro
The reply url specified in the request does not match the reply urls configured for the application: '<application-id>'
Solução
Verifique se o URI de redirecionamento em sua solicitação corresponde a um dos do aplicativo.
Validar um token de acesso
Quando você tem um token de acesso do Microsoft Entra ID, você pode verificar se ele inclui as informações corretas (consulte validar tokens).
Você deve verificar se os seguintes campos correspondem ao registro:
- aud: A ID do recurso Azure Databricks:
2ff814a6-3304-4ab8-85cb-cd0e6f879c1d
- iss: Deve ser
https://sts.windows.net/<tenant-id>/
- tid: Deve ser o locatário do espaço de trabalho (procure isso pelo ID da organização ou ID do dispositivo do espaço de trabalho)
- nbf/exp: O tempo atual deve cair entre
nbf
eexp
- unique_name: Deve ser um usuário que existe no espaço de trabalho Databricks, a menos que o usuário seja um contribuidor no recurso do dispositivo de espaço de trabalho
Valide a assinatura do token usando os certificados públicos dos pontos de extremidade OIDC.
Aqui está um trecho de código que mostra a carga útil do token. Você deve primeiro instalar a biblioteca PyJWT usando pip install pyjwt
e a biblioteca de criptografia usando 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])}")
Se desejar uma decodificação completa (incluindo verificação de assinatura) do token, você pode usar o seguinte trecho de código. Você deve primeiro instalar a biblioteca PyJWT usando pip install pyjwt
e a biblioteca de criptografia usando pip install cryptography
. Além disso, certifique-se de substituir <databricks-resource-id>
no seguinte código:
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])}")
Aqui está um exemplo da saída do trecho de código acima:
Você também pode visualizar o token decodificado através de decodificadores JWT on-line se eles não forem confidenciais. Exemplos de descodificadores em linha são jwt.ms e jwt.io.