java Spring授权服务器1.0.0:请求/oauth2/令牌时出现invalid_client错误

slsn1g29  于 2023-01-04  发布在  Java
关注(0)|答案(2)|浏览(462)

我已经使用Spring授权服务器存储库中提供的example设置了一个简单的Spring授权服务器。
我正在使用OIDC Debugger进行测试。我能够获得表单登录页面。我输入了我的用户ID和密码,并且成功地获得了授权代码。下一步是交换此代码以获得访问令牌(从/oauth2/token端点)。下面是我得到错误的地方。
这是我对/oauth2/token的请求

curl --location --request POST 'http://localhost:8080/oauth2/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=authorization_code' \
--data-urlencode 'client_id=messaging-client' \
--data-urlencode 'client_secret=secret' \
--data-urlencode 'code=ARfoO0m_srZSzi0RJgryvAyxOEmcoOHAZbFVYJlmng71x1CTv7qdCGD3I-DwG8EuBYBdyUGhmZwo5LBmoXyoxxuEuSZwJ7tPjYvQED7OBriRc4uFky5NbtNKuctz1PGt' \
--data-urlencode 'redirct_uri=https%3A%2F%2Foidcdebugger.com%2Fdebug'

当我发送这个请求时,我收到一个401 Unauthorized错误,其正文如下:

{
    "error": "invalid_client"
}

我的安全配置(为简洁起见,仅显示客户端设置)

@Bean
    public RegisteredClientRepository registeredClientRepository(JdbcTemplate jdbcTemplate) {
        RegisteredClient registeredClient = RegisteredClient.withId(UUID.randomUUID().toString())
                .clientId("messaging-client")
                .clientSecret("{noop}secret")
                .clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_BASIC)
                .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
                .authorizationGrantType(AuthorizationGrantType.REFRESH_TOKEN)
                .authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS)
                .redirectUri("http://127.0.0.1:8080/login/oauth2/code/messaging-client-oidc")
                .redirectUri("http://127.0.0.1:8080/authorized")
                .redirectUri("https://oidcdebugger.com/debug")
                .scope(OidcScopes.OPENID)
                .scope(OidcScopes.PROFILE)
                .scope("message.read")
                .scope("message.write")
                .clientSettings(ClientSettings.builder().requireAuthorizationConsent(true).build())
                .build();

        // Save registered client in db as if in-memory
        JdbcRegisteredClientRepository registeredClientRepository = new JdbcRegisteredClientRepository(jdbcTemplate);
        registeredClientRepository.save(registeredClient);

        return registeredClientRepository;
    }

而且,我还使用了Spring授权服务器依赖项的1.0.0版本。

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-oauth2-authorization-server</artifactId>
    <version>1.0.0</version>
</dependency>

我错过了什么?

    • 编辑:**我还尝试将客户端ID和密码作为Basic Auth Header(Base64编码)传递,如下所示:
curl --location --request POST 'http://localhost:8080/oauth2/token' \
    --header 'Authorization: Basic bWVzc2FnaW5nLWNsaWVudDpzZWNyZXQ=' \
    --header 'Content-Type: application/x-www-form-urlencoded' \
    --data-urlencode 'grant_type=authorization_code' \
    --data-urlencode 'code=ARfoO0m_srZSzi0RJgryvAyxOEmcoOHAZbFVYJlmng71x1CTv7qdCGD3I-DwG8EuBYBdyUGhmZwo5LBmoXyoxxuEuSZwJ7tPjYvQED7OBriRc4uFky5NbtNKuctz1PGt' \
--data-urlencode 'redirct_uri=https%3A%2F%2Foidcdebugger.com%2Fdebug'

但这次,我得到了一个400 Bad Request错误,其有效负载如下

{
    "error": "invalid_grant"
}
aemubtdh

aemubtdh1#

我正在使用OIDC调试器来测试它。
您给予调试器的Authorize URI是什么?您不能在那里使用localhost,因为调试器需要访问它。
我建议要么设置端口转发到8080端口,要么使用隧道/反向代理(如ngrok)来临时暴露您的授权服务器,确保使用自定义转发url而不是localhost

83qze16e

83qze16e2#

我发现了这个问题。在对/oauth/token的请求中,我在redirect_uri参数中打错了字。我修正了这个问题,它工作了。
这是我的愚蠢错误!

相关问题