首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在用户登录后只显示用户可用的端点

在用户登录后只显示用户可用的端点
EN

Stack Overflow用户
提问于 2019-12-26 08:01:57
回答 1查看 2.2K关注 0票数 4

我想设置以下工作流:

  1. 最初,没有登录,Swagger只显示2-3个端点-这将通过提供有限的openapi3 json从后端,没有问题;
  2. 用户通过授权按钮登录(工作,openapi3 json有必要的信息);
  3. 登录后,Swagger又发出一个带有用户凭据的请求,后端为新的openapi3 json提供了这个特定用户可用的端点,Swagger用新的数据重新绘制页面。最好是,用户仍然登录。

可以用Swagger做第3项吗?如何使用OAuth2承载令牌手动发出Swagger的请求(因为用户已登录,令牌必须显示在某个位置)并重新绘制Swagger页面?

EN

回答 1

Stack Overflow用户

发布于 2020-01-03 15:02:11

该任务是通过使用其插件系统进行Swagger定制完成的。

实际上,Swagger是一个使用React / Redux的JavaScript (Babel,Webpack)项目,因为我不知道React (我的工具是Python),所以很难深入研究它,但最终我成功了。

下面是我的自定义插件的代码和注释:

代码语言:javascript
运行
复制
    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)
              }
            }
          }
        }

      }
    }

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

代码语言:javascript
运行
复制
        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
    })
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59485557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档