微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

由 Python + connexion 提供的 Swagger UI 和 keycloak 集成简单示例

如何解决由 Python + connexion 提供的 Swagger UI 和 keycloak 集成简单示例

当使用连接中包含的 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
解压 keycloak-13.0.1.zip
cd keycloak-13.0.1/bin
./add-user-keycloak.sh -u admin -p admin@123 -r master
使用 ./standalone.sh -b mykeycloakhost.domain
启动 keyclock 使用浏览器转到 http://mykeycloakhost.domain:8080/auth
单击管理控制台并使用凭据 admin/admin@123
登录 将鼠标悬停在 Master(左上角)上,然后单击“添加领域”
将您的新领域命名为“myrealm”并单击创建
单击“管理”菜单下的“用户”项,然后单击“添加用户
输入你想要的用户名,然后点击保存
在凭据选项卡中设置密码(不要忘记禁用临时按钮),然后单击“重置密码”
单击“配置”菜单中的“客户端”项,然后单击“创建”
将其命名为“myclient”,输入 http://myapihost.domain:8080/ui 作为根 URL 并单击保存。
启用“启用隐式流”,将有效重定向 URI 设置为 myapihost.domain:8080/uI/Oauth2-redirect.html(不带 http://),然后单击保存。

启动 api 服务器:
使用 ./app.py
运行应用程序 使用浏览器转到 http://myapihost.domain:8080/ui
点击授权并输入客户端ID:myclient

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?