文章目录
- 1 自动从keycloak获取公钥
- 1.1 X.509证书vs裸RSA公钥
- 1.2 提取公钥
- 2 基于flask_jwt_extended(app.py)
- 2.1 代码功能分步解析
- 2.1.1 配置与发现 (Discovery)
- 2.1.2 公钥提取与配置
- 2.1.3 创建受保护的路由
- 2.2 整体代码
- 3 基于authlib(app.py)
- 3.1 代码功能分步解析
- 3.1.1 配置与发现(Discovery)
- 3.1.2 公钥导入与验签器设置
- 3.1.3 创建受保护的路由
- 3.2 整体代码
分别利用flask_jwt_extended库和Authlib库来验证由Keycloak颁发的JWT(JSON Web Token),从而保护特定的API接口。
1 自动从keycloak获取公钥
如果你希望你的Flask代码能够自动从Keycloak获取公钥(而不是硬编码,需要把代码升级为支持OIDC Discovery的版本)。
1.1 X.509证书vs裸RSA公钥
1、Keycloak页面显示的(手动复制的):
这是标准的PKCS#8 / X.509 SubjectPublicKeyInfo格式。它包含了一些元数据头(告诉程序“这是一个RSA 公钥”),然后才是具体的密钥数据。它的 Base64内容通常以MIIBIjAN… 开头。
2、JWKS(x5c)里的内容:
JWKS标准中的x5c字段存放的是X.509证书的DER编码。
区别点: 证书不仅包含公钥,还包含颁发者、有效期、序列号等证书特有的元数据。
结果: 因为头部信息不同,所以即使它们指向同一个密钥对,Base64 字符串也是完全不同的。
既然x5c是证书,我们就把它当证书加载,然后从中提取公钥。这是最稳健的做法。
1.2 提取公钥
importrequests from cryptography