如何获取Epic FHIR资源的JWK URL?含Django REST框架疑问
关于Epic OAuth2配置中JWK URL的实现方案
核心结论
Epic要求的JWK URL是你的应用需要自行暴露的端点,用来让Epic获取你的公钥(以JWK格式),从而验证你发送的JWT签名(比如客户端认证时的JWT Assertion)。你调用Epic的smart-configuration端点找不到相关内容是正常的,因为这个URL是你提供给Epic的,而非从Epic获取。
在Django REST Framework中实现JWK端点的步骤
1. 准备RSA密钥对与JWK转换
你已经上传给Epic的公钥需要转换成JWK格式。可以通过以下方式处理:
- 如果你已有PEM格式的公钥,使用
cryptography和pyjwt库转换为JWK。 - 示例转换代码(可在本地运行生成JWK):
from cryptography.hazmat.primitives import serialization from jwt.utils import base64url_encode # 读取PEM公钥 with open("public_key.pem", "rb") as f: public_key = serialization.load_pem_public_key(f.read()) # 提取公钥参数 numbers = public_key.public_numbers() n = base64url_encode(numbers.n.to_bytes((numbers.n.bit_length() + 7) // 8, byteorder="big")).decode("utf-8") e = base64url_encode(numbers.e.to_bytes((numbers.e.bit_length() + 7) // 8, byteorder="big")).decode("utf-8") # 构建JWK jwk = { "kty": "RSA", "alg": "RS256", "use": "sig", "n": n, "e": e, "kid": "your-key-id" # 自定义密钥ID,用于标识你的公钥 }
2. 创建DRF视图
在你的Django项目中新建一个视图,返回JWK集(JWKS)格式的响应:
from rest_framework.views import APIView from rest_framework.response import Response class JWKSView(APIView): # 不需要认证,允许Epic直接访问 authentication_classes = [] permission_classes = [] def get(self, request): # 这里替换成你生成的JWK jwk = { "kty": "RSA", "alg": "RS256", "use": "sig", "n": "你的公钥n值", "e": "你的公钥e值", "kid": "your-key-id" } return Response({"keys": [jwk]})
3. 配置URL路由
在项目的urls.py中添加路由:
from django.urls import path from .views import JWKSView urlpatterns = [ # 其他路由... path(".well-known/jwks.json", JWKSView.as_view(), name="jwks"), ]
4. 验证与配置
- 启动Django服务后,访问
http://your-domain/.well-known/jwks.json,确认返回的JSON格式正确。 - 将这个URL填写到Epic应用配置页面的JWK URL字段中。
注意事项
- 确保该端点公开可访问,不要添加认证或IP限制,否则Epic无法获取你的公钥。
- JWK中的
kid要保持唯一,如果你有多组密钥,可在JWKS中添加多个JWK对象。 - 公钥必须和你上传给Epic的完全一致,否则签名验证会失败。
内容的提问来源于stack exchange,提问作者sandeepsinghnegi
相关产品推荐
相关产品推荐

