Compartilhar via


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

  1. Se o recurso AzureDatabricks não for adicionado ao seu aplicativo, peça a um usuário administrador para adicioná-lo.
  2. 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 e exp
  • 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:

Configurações do aplicativo registrado do Azure

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.