다음을 통해 공유


Microsoft Entra ID 액세스 토큰 문제 해결

이 문서에서는 Microsoft Entra ID 액세스 토큰을 가져올 때 발생할 수 있는 오류를 해결하는 방법과 액세스 토큰의 유효성을 검사하는 방법을 설명합니다.

사용자 이름 및 암호를 사용하여 토큰을 가져오지 못했습니다.

오류 메시지

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.

솔루션

  1. AzureDatabricks 리소스가 애플리케이션에 추가되지 않은 경우 관리자에게 추가하도록 요청합니다.
  2. 대화형 메서드를 사용하여 토큰을 가져옵니다. 웹 페이지에서는 애플리케이션에 권한을 부여하도록 안내합니다. 또는 애플리케이션 구성에 설명된 권한 부여 단추를 클릭합니다. 권한이 부여된 후에는 프로그래밍 방식의 메서드를 사용하여 토큰을 가져올 수 있습니다.

리디렉션 URI가 일치하지 않음

오류 메시지

The reply URL specified in the request does not match the reply URLs configured for the application: '<application-id>'

솔루션

요청한 리디렉션 URI가 애플리케이션의 리디렉션 URI 중 하나와 일치하는지 확인합니다.

액세스 토큰의 유효성 검사

Microsoft Entra ID 액세스 토큰이 있는 경우 올바른 정보가 포함되어 있는지 확인할 수 있습니다(토큰 유효성 검사 참조).

다음 필드가 레코드와 일치하는지 확인해야 합니다.

  • aud: Azure Databricks 리소스 ID입니다. 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d
  • iss: https://sts.windows.net/<tenant-id>/이어야 합니다.
  • tid: 작업 영역의 테넌트여야 합니다(조직 ID 또는 작업 영역 어플라이언스 ID로 조회).
  • nbf/exp: 현재 시간은 nbfexp 사이여야 합니다.
  • unique_name: 사용자가 작업 영역 어플라이언스 리소스의 기여자가 아닌 한 Databricks 작업 영역에 있는 사용자여야 합니다.

OIDC 엔드포인트에서 공용 인증서를 사용하여 토큰 서명의 유효성을 검사합니다.

토큰의 페이로드를 보여 주는 코드 조각은 다음과 같습니다. 먼저 다음을 pip install pyjwt 라이브러리 및 암호화 라이브러리를 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])}")

토큰의 전체 디코딩(서명 확인 포함)을 원하는 경우 다음 코드 조각을 사용할 수 있습니다. 먼저 을 pip install cryptography 라이브러리 및 암호화 라이브러리를 설치해야 합니다. 또한 다음 코드에서 바꿔 <databricks-resource-id> 야 합니다.

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])}")

민감하지 않은 경우 온라인 JWT 디코더를 통해 디코딩된 토큰을 확인할 수도 있습니다. 온라인 디코더의 예로 jwt.msjwt.io가 있습니다.