gpt4 book ai didi

swagger - 仅在用户登录后在 Swagger 中显示用户可用的端点

转载 作者:行者123 更新时间:2023-12-04 17:31:16 27 4
gpt4 key购买 nike

我想设置以下工作流程:

  • 最初,在没有登录的情况下,Swagger 仅显示 2-3 个端点 - 这将通过从后端提供有限的 openapi3 json 来完成,没问题;
  • 用户通过授权按钮登录(有效,openapi3 json 有必要的信息);
  • 登录后,Swagger 再发出一个带有用户凭据的请求,后端提供新的 openapi3 json 和此特定用户可用的端点,然后 Swagger 使用新数据重新绘制页面。最好,用户仍处于登录状态。

  • 是否可以使用 Swagger 完成第 3 项?如何使用 OAuth2 不记名 token 从 Swagger 手动发出请求(由于用户已登录, token 必须在某处出现)并重绘 Swagger 页面?

    最佳答案

    该任务是通过 Swagger 自定义使用其 plugin system 完成的。 .
    实际上,Swagger 是一个使用 React/Redux 的 JavaScript(Babel、Webpack)项目,由于我不了解 React(我的工具是 Python),因此深入研究它有点困难,但最终我成功了。
    这是我的带有注释的自定义插件的代码:

        const AuthorizedPlugin = function(system) {
    return {
    statePlugins: {
    auth: { // namespace for authentication subsystem
    // last components invoked after authorization or logout are
    // so-called reducers, exactly they are responsible for page redraw
    reducers: {
    "authorize_oauth2": function(state, action) {
    let { auth, token } = action.payload
    let parsedAuth

    auth.token = Object.assign({}, token)
    parsedAuth = system.Im.fromJS(auth)

    var req = {
    credentials: 'same-origin',
    headers: {
    accept: "application/json",
    Authorization: "Bearer " + auth.token.access_token
    },
    method: 'GET',
    url: system.specSelectors.url()
    }
    // this is the additional request with token I mentioned in the question
    system.fn.fetch(req).then(
    function (result) {
    // ... and we just call updateSpec with new openapi json
    system.specActions.updateSpec(result.text)
    }
    )

    // This line is from the original Swagger-ui code
    return state.setIn( [ "authorized", parsedAuth.get("name") ], parsedAuth )
    },
    "logout": function(state, action) {
    var req = {
    credentials: 'same-origin',
    headers: { accept: "application/json" },
    method: 'GET',
    url: system.specSelectors.url()
    }
    // for logout, request does not contain authorization token
    system.fn.fetch(req).then(
    function (result) {
    system.specActions.updateSpec(result.text)
    }
    )
    // these lines are to make lock symbols gray and remove credentials
    var result = state.get("authorized").withMutations(function (authorized) {
    action.payload.forEach(function (auth) {
    authorized.delete(auth);
    });
    });
    return state.set("authorized", result)
    }
    }
    }
    }

    }
    }

    像往常一样插入这个插件:

            const ui = SwaggerUIBundle({{
    url: '{openapi_url}',
    dom_id: '#swagger-ui',
    defaultModelsExpandDepth: -1,
    displayOperationId: false,
    presets: [
    SwaggerUIBundle.presets.apis,
    SwaggerUIBundle.SwaggerUIStandalonePreset
    ],
    plugins: [
    AuthorizedPlugin
    ],
    layout: "BaseLayout",
    deepLinking: true
    })

    关于swagger - 仅在用户登录后在 Swagger 中显示用户可用的端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59485557/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com