Epic FHIR OAuth2 `client_credentials` с JWT возвращает `invalid_client` — что я делаю не так?Python

Программы на Python
Anonymous
Epic FHIR OAuth2 `client_credentials` с JWT возвращает `invalid_client` — что я делаю не так?

Сообщение Anonymous »

Я пытаюсь получить токен доступа от конечной точки Epic FHIR OAuth2, используя грант client_credentials со подписанным JWT (

Код: Выделить всё

client_assertion). Я продолжаю получать:
{
"error": "invalid_client",
"error_description": null
}

Что я делал шаг за шагом

1. Сгенерированная пара ключей RSA:

Код: Выделить всё

openssl genrsa -out privatekey.pem 2048
openssl req -new -x509 -key privatekey.pem -out publickey509.pem -subj '/CN=MyApp'
openssl x509 -pubkey -noout -in publickey509.pem > pubkey.pem
2. Открытый ключ преобразован в JWKS с помощью Python:

Код: Выделить всё

import json
from jwcrypto import jwk

with open("pubkey.pem", "rb") as f:
key = jwk.JWK.from_pem(f.read())

key_dict = json.loads(key.export_public())
key_dict["kid"] = "my-key-id-001"
jwks = {"keys": [key_dict]}
print(json.dumps(jwks, indent=2))
3. Разместил JWKS как необработанный URL-адрес GitHub Gist и установил его как URL-адрес производственного набора JWK при регистрации приложения Epic.
4. Сгенерированный JWT:

Код: Выделить всё

import jwt, time, uuid

private_key = open("privatekey.pem").read()

payload = {
"iss": "",
"sub": "",
"aud": "https://fhir.epic.com/interconnect-fhir-oauth/oauth2/token",
"jti": str(uuid.uuid4()),
"exp": int(time.time()) + 300
}

token = jwt.encode(payload, private_key, algorithm="RS384", headers={"kid": "my-key-id-001"})
5. Запрос почтальона — POST https://fhir.epic.com/interconnect-fhir ... uth2/token

Код: Выделить всё

grant_type=client_credentials
client_id=
client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer
client_assertion=

Что, как я подозреваю, может быть не так

  • в заголовке JWT может не соответствовать JWKS, размещенному в Gist.
  • GitHub Gist может отображать неправильный тип контента: application/json
  • В JWKS отсутствуют обязательные поля (, е, n)
  • утверждение неверно
  • Приложение не полностью активировано на портале Epic

Вопросы

  • Каков правильный сквозной поток для Epic FHIR client_credentials + JWT?
  • Является ли GitHub Gist допустимым хостом для URL-адреса набора JWK?
  • Должен ли ребенок в заголовке JWT точно совпадать с кодом в JWKS?
  • Каковы распространенные причины появления инвалидного_клиента с нулевым описанием в Epic?

Вернуться в «Python»