Memecahkan masalah token akses ID Microsoft Entra
Artikel ini menjelaskan cara memecahkan masalah kesalahan yang mungkin Anda temui saat mendapatkan token akses ID Microsoft Entra dan cara memvalidasi token akses.
Gagal mendapatkan token menggunakan nama pengguna dan kata sandi
Pesan kesalahan
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.
Solusi
- Jika sumber daya AzureDatabricks tidak ditambahkan ke aplikasi Anda, minta pengguna Admin untuk menambahkannya.
- Gunakan metode interaktif untuk mendapatkan token. Halaman web akan memandu Anda untuk memberikan izin ke aplikasi. Atau, klik tombol Berikan izin yang dijelaskan dalam konfigurasi aplikasi. Setelah izin diberikan, Anda dapat menggunakan metode terprogram untuk mendapatkan token.
URL pengalihan tidak cocok
Pesan kesalahan
The reply url specified in the request does not match the reply urls configured for the application: '<application-id>'
Solusi
Periksa apakah URI pengalihan dalam permintaan Anda cocok dengan salah satu yang ada di aplikasi.
Memvalidasi token akses
Saat Anda memiliki token akses ID Microsoft Entra, Anda dapat memverifikasi bahwa token tersebut menyertakan informasi yang benar (lihat memvalidasi token).
Anda harus memverifikasi bahwa bidang berikut cocok dengan catatan:
- aud: ID sumber daya Azure Databricks:
2ff814a6-3304-4ab8-85cb-cd0e6f879c1d
- iss: Harus
https://sts.windows.net/<tenant-id>/
- tid: Harus menjadi penyewa ruang kerja (cari ini baik dengan ID organisasi atau ID appliance ruang kerja)
- nbf/exp: Waktu saat ini harus jatuh di antara
nbf
danexp
- unique_name: Harus menjadi pengguna yang ada di ruang kerja Databricks, kecuali pengguna adalah kontributor pada sumber daya appliance ruang kerja
Validasi tanda tangan token menggunakan sertifikat publik dari titik akhir OIDC.
Berikut adalah cuplikan kode yang menunjukkan payload token. Anda harus terlebih dahulu menginstal pustaka PyJWT menggunakan pip install pyjwt
dan pustaka kriptografi menggunakan 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])}")
Jika Anda menginginkan decoding penuh (termasuk verifikasi tanda tangan) dari token, Anda dapat menggunakan cuplikan kode berikut. Anda harus terlebih dahulu menginstal pustaka PyJWT menggunakan pip install pyjwt
dan pustaka kriptografi menggunakan pip install cryptography
. Selain itu, pastikan untuk mengganti <databricks-resource-id>
dalam kode berikut:
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])}")
Berikut adalah contoh keluaran dari cuplikan kode di atas:
Anda juga dapat melihat token yang diterjemahkan melalui dekoder JWT online jika tidak sensitif. Contoh dekoder online adalah jwt.ms dan jwt.io.