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 validá-los.
Falha ao obter token usando o nome de usuário e a 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 administrador para adicioná-lo.
- Use o método interativo para obter o token. A página da Web orientará você na concessão de permissões para o 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 na solicitação corresponde a um daqueles no aplicativo.
Validar um token de acesso
Quando você tiver um token de acesso do Microsoft Entra ID, verifique se ele inclui as informações corretas (confira Validar 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 workspace (procure pela ID da organização ou pela ID do dispositivo de workspace)
- 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.
Este é um snippet de código que mostra o conteúdo 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 quiser uma decodificação completa (incluindo a verificação de assinatura) do token, use o seguinte snippet de código. 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])}")
Este é um exemplo da saída do snippet de código acima:
Veja também o token decodificado por meio de decodificadores de JWT online se eles não forem confidenciais. Alguns exemplos de decodificadores online são o jwt.ms e o jwt.Io.