Feign 客户端 OAuth2 授权类型密码

Feign client OAuth2 grant type password

我想使用 Feign 客户端访问一项服务。问题是它需要使用 OAuth2, password 进行授权(如 Swagger 的 Authorize 页面所述,并且已设置 flow: password)。

在服务的 Swagger 页面中,只需单击 Authorize 并输入我的 loginpassword,我就可以访问这些方法,选择request body 并将 client_idclient_secret 字段保留为默认值,但我现在如何使用 Feign 客户端来做到这一点?

我试过按照这个 guide 但是它描述了如何使用授权类型 client_credentials 来做到这一点所以它对我不起作用,它预计会给出错误并且没有访问方法服务。我检查了服务的 api 以确保授权类型实际上是 password。发送请求时,它使用“Bearer null”进行。

feign.FeignException$Unauthorized: [401] during [GET] to [...] [TestFeignClient#req(String)]: [{"error":"invalid_token","error_description":"Cannot convert access token to JSON"}]

有很多我不知道的代码,所以我试图找到另一个关于授权类型的指南 password。我试着关注 this guide which suits my situation, but Maven gives me errors about these dependencies, so the code is all red too (I checked the source code of the guide which can be found here 要找到依赖项,它在 customer package pom 中,在分支 with_database 上,正如作者在评论部分所说:

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>

所以我的问题是:如何使用 Feign 客户端正确实现 OAuth2 密码授权类型?是否有关于如何操作的实际指南?因为除了这两个我没有找到任何东西,而且它们都不适合我。

授予类型“密码”意味着您的资源服务器将用户标识和密码发送到身份验证服务器(oauth 2 服务器)。这意味着您将通过网络发送与应用程序的实际用户相关的数据。这不再是您想要做的事情,并且此授权类型已弃用。

当你说你大摇大摆地输入客户端 ID 和客户端密码时,你实际上使用的是授权类型“客户端凭据”,而不是授权类型“密码”。您“通过线路”发送的数据标识了一个应用程序或客户端,因此标识了 CLIENT id 和 CLIENT secret。

您输入的用户名和密码没有发送到授权服务器。这可能是您在 swagger 面具前的某种 BASIC 身份验证。

坚持您的 Bealdung 指南,这正是您想要做的。设置您在 4.2 下可以看到的所有 bean 并提供所需的配置。之后你应该能够自动装配配置的 feignclient bean 并在任何地方使用它。

已解决,您需要添加这个我没有注意到的依赖项,以便不指定依赖项的版本:

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Edgware.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

或者只指定依赖项的版本(第二指南)。