Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este artigo descreve como solucionar erros que você pode encontrar ao obter tokens de acesso da ID do Microsoft Entra 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 do AzureDatabricks não for adicionado ao seu aplicativo, peça a um usuário administrador para adicioná-lo.
- Use o método interativo para obter o token. A página da Web orientará você a 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 são correspondentes
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 daqueles no aplicativo.
Validar um token de acesso
Quando você tem um token de acesso do Microsoft Entra ID, pode verificar se ele inclui as informações corretas (consulte a validação de tokens).
Você deve verificar se os seguintes campos correspondem ao registro:
-
aud: A ID do recurso do 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 (pesquise isso pelo ID da organização ou ID do appliance do espaço de trabalho)
-
nbf/exp: a hora atual deve ficar entre
nbf
eexp
- unique_name: deve ser um usuário que existe no workspace do Databricks, a menos que o usuário seja um colaborador no recurso de dispositivo de workspace
Valide a assinatura do token usando os certificados públicos dos pontos de extremidade do OIDC.
Aqui está um trecho de código que mostra a carga útil do token. Primeiro, você deve 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 você quiser uma decodificação completa (incluindo a verificação de assinatura) do token, poderá usar o snippet de código a seguir. Primeiro, você deve instalar a biblioteca PyJWT usando pip install pyjwt
e a biblioteca de criptografia usando pip install cryptography
. Além disso, substitua <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])}")
Você também pode exibir o token decodificado por meio de decodificadores JWT online se eles não forem confidenciais. Exemplos de decodificadores online são jwt.ms e jwt.io.