当前位置: 首页 > 知识库问答 >
问题:

springdoc/Swagger UI未将OAuth2令牌传递给API

胥宏义
2023-03-14

我正在使用springdoc(v1.5.9)为API生成虚张声势定义。在Swagger UI内部进行身份验证并执行安全方法后,Spring Boot应用程序接收到的http请求没有身份验证头。我已经通过JS调试器确认Swagger UI接收并存储了有效的身份验证令牌。

下面是HTTP请求、显示定义/应用于该方法的安全方案的Swagger api-docs、springdoc配置和控制器。

我需要如何更改/添加我的Spring配置,才能从Swagger UI将授权传递给API?

收到HTTP请求

Request received for GET '/foo/1234':
org.apache.catalina.connector.RequestFacade@71c70030

servletPath:/foo/1234
pathInfo:null
headers: 
host: localhost:8070
connection: keep-alive
sec-ch-ua: "Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"
accept: application/json
sec-ch-ua-mobile: ?0
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36
sec-fetch-site: same-origin
sec-fetch-mode: cors
sec-fetch-dest: empty
referer: http://localhost:8070/swagger-ui/index.html?configUrl=/v3/api-docs/swagger-config
accept-encoding: gzip, deflate, br
accept-language: en-US,en;q=0.9
cookie: JSESSIONID=A0F9846102153C06D77D6ED5506CC227
Security filter chain: [
  WebAsyncManagerIntegrationFilter
  SecurityContextPersistenceFilter
  HeaderWriterFilter
  CsrfFilter
  LogoutFilter
  BearerTokenAuthenticationFilter
  RequestCacheAwareFilter
  SecurityContextHolderAwareRequestFilter
  AnonymousAuthenticationFilter
  SessionManagementFilter
  ExceptionTranslationFilter
  FilterSecurityInterceptor
]

api文档

{
    "openapi": "3.0.1",
    "info": {
        "title": "My App",
        "version": "v1"
    },
    "servers": [
        {
            "url": "http://localhost:8070",
            "description": "Generated server url"
        }
    ],
    "paths": {
        "/foo/{id}": {
            "get": {
                "tags": [
                    "foo"
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                },
                "security": [
                    {
                        "custom": [
                        ]
                    }
                ]
            }
        },
        "securitySchemes": {
            "access_token": {
                "type": "oauth2",
                "in": "header",
                "scheme": "custom",
                "flows": {
                    "authorizationCode": {
                        "authorizationUrl": "https://login.myauthsever.com/v2/oauth/authorize",
                        "tokenUrl": "https://login.myauthsever.com/v2/oauth/token",
                        "scopes": {
                        }
                    }
                }
            }
        }
    }
}

OpenAPI配置

@OpenAPIDefinition(info = @Info(title = "My App", version = "v1"))
@SecurityScheme(scheme = "custom", type = SecuritySchemeType.OAUTH2, in = SecuritySchemeIn.HEADER, name = "access_token",
        flows = @OAuthFlows(authorizationCode = @OAuthFlow(
                authorizationUrl = "https://login.myauthsever.com/v2/oauth/authorize",
                tokenUrl = "https://login.myauthsever.com/v2/oauth/token", scopes = {})))

public class OpenApiConfig {
}

控制器

@RestController
@Tag(name = "foo")
@SecurityRequirement(name = "custom")
public class SystemSigController {
        @GetMapping(path = "/foo/{id}")
        String getFoo(@PathVariable String id) {
            ...
        }
}

共有1个答案

燕文昌
2023-03-14

@SecurityRequirement.name值必须与@SecurityScheme.name相同。

因为您有@SecurityScheme(…,name=“access\u token”…) ,控制器必须使用:

@SecurityRequirement(name = "access_token")

 类似资料:
  • 我正在尝试访问授权服务器,该服务器在用户提供用户名和密码时发出短期访问令牌和长期刷新令牌。 < li >客户端是应该在每次调用API时将刷新令牌与访问令牌一起传递,还是应该仅在从API收到访问令牌已过期的错误代码时才传递刷新令牌? < li >刷新令牌过期后,什么类型的错误代码会传回客户端?这意味着客户端需要通过再次传递用户名和密码来请求新的访问令牌。

  • 我正在尝试使用spotipy python库构建一个应用程序来访问spotify api。 我的oauth代码看起来是这样的,除了用正确的auth参数初始化客户端之外,它似乎是有效的。 ... 向用户发送网址。在用户说她/他已经授予权限后:从Web服务器获取身份验证代码并用于生成令牌。 self.auth_token如下所示: 然后我像这样初始化 spotipy 客户端模块: 然后我尝试以下方法:

  • 我正在使用PyJWT库(导入jwt)库生成用于身份验证的JSON web令牌。 最初的设计让我们通过URL传入令牌,比如http://example.net?token=EYKDFKDFKDNDFK... 但是,使用此解决方案,似乎任何查看URL中的令牌的人都可以使用此令牌访问站点。

  • 出身背景 我已经实现了ThinkStructure。识别服务器。V3(openID Connect one)。我已将OAuth2承载令牌以以下形式返回给我的javascript客户端(隐式流): 但在所有示例中,它们仅在调用服务时将access_token传递给资源提供程序。 假设 如果我做对了,我会用访问令牌进行身份验证。然后,我根据id_令牌中的声明进行授权(我不想进行单独的DB调用——我希望

  • 我试图生成一个access_token和refresh_token访问谷歌电子表格API。我使用了APIhttps://www.googleapis.com/oauth2/v3/token?code=

  • 问题内容: 这里有角的新手。我试图找出将对象传递给指令时出了什么问题。 这是我的指令: 这是我调用指令的模板: 是一组对象。 当我运行此,日志,而日志罚款的范围,甚至有一个与所有的数据,我找孩子。 我不确定我在这里做错了什么,因为这种确切的方法以前对我有用。 编辑: 我已经用所有必需的代码创建了一个插件:http ://plnkr.co/edit/uJCxrG 如您所见,该作用域在范围中可用,但我