python - Python + connexion 和 keycloak 集成服务的 Swagger UI 简单示例
问题描述
当使用 connexion 中包含的 swagger 时,我正在尝试使用 Oauth2 隐式流来保护 /secret api 端点。
为此,我想使用 Keycloak 开源身份和访问管理解决方案。
我不能让它工作。我究竟做错了什么?有人有一个具有相同设置(即python+connexion+keycloak)的简单工作示例吗?
我不知道我的问题是否与 python 或 Yaml 甚至 keycloak 设置有关
感谢任何可以帮助使其工作的人
这是我到目前为止所拥有的:
应用程序的python代码:
#!/usr/bin/env python3
import connexion
import jwt
from connexion.exceptions import OAuthProblem
def verifyToken(jwt_token):
try:
payload = jwt.decode(jwt_token, 'SECRET_KEY', algorithms=['HS256'])
return payload
except jwt.ExpiredSignatureError:
raise OAuthProblem('Token expired. Please log in again.')
except jwt.InvalidTokenError:
raise OAuthProblem('Invalid token. Please log in again.')
def get_secret() -> str:
return "The secret is 'secret string'"
if __name__ == '__main__':
options = {
"swagger_ui_config": {
"oauth2RedirectUrl": "myapihost.domain:8080/ui/oauth2-redirect.html"
}
}
app = connexion.FlaskApp(__name__, options=options)
#app = connexion.FlaskApp(__name__)
app.add_api('openapi.yaml', validate_responses=True)
app.run(host='myapihost.domain', port=8080)
这是相应的 openapi.yaml :
openapi: 3.0.0
info:
title: Basic Auth Example
version: '1.0'
paths:
/secret:
get:
summary: Return secret string
operationId: app.get_secret
responses:
'200':
description: secret response
content:
'*/*':
schema:
type: string
security:
- keycloak: []
components:
securitySchemes:
keycloak:
type: oauth2
flows:
implicit:
authorizationUrl: http://mykeycloakhost.domain:8080/auth/realms/myrealm/protocol/openid-connect/auth
scopes: {}
x-tokenInfoFunc: app.verifyToken
Keycloak设置:
你需要java来运行(我用openjdk-16.0.1_linux-x64_bin.tar.gz)
export JAVA_HOME=whatever_dir_you_untarred_openjdk
unzip keycloak-13.0.1.zip
cd keycloak-13.0.1/bin
./add-user-keycloak .sh -u admin -p admin@123 -r master
start keyclock with ./standalone.sh -b mykeycloakhost.domain
使用浏览器访问http://mykeycloakhost.domain:8080/auth
点击管理控制台并使用登录凭据 admin/admin@123
将鼠标悬停在 Master(左上角)上并单击“添加领域”
将您的新领域命名为“myrealm”并单击创建
单击“管理”菜单下的“用户”项并单击“添加用户”
输入您想要的用户名并单击节省
在凭据选项卡中设置密码(不要忘记禁用临时按钮)并单击“重置密码”
单击配置菜单中的客户端项并单击“创建”
将其命名为“myclient”,输入http://myapihost.domain :8080/ui作为 Root Url 并点击保存。
启用“启用隐式流”,将有效重定向 URI 设置为 myapihost.domain:8080/ui/oauth2-redirect.html(不带 http://),然后单击保存。
启动 api 服务器:
使用 ./app.py
使用浏览器运行应用程序 转到http://myapihost.domain:8080/ui
单击授权并输入客户端 ID:myclient