我已经使用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"
}
2条答案
按热度按时间aemubtdh1#
我正在使用OIDC调试器来测试它。
您给予调试器的
Authorize URI
是什么?您不能在那里使用localhost
,因为调试器需要访问它。我建议要么设置端口转发到8080端口,要么使用隧道/反向代理(如ngrok)来临时暴露您的授权服务器,确保使用自定义转发url而不是
localhost
。83qze16e2#
我发现了这个问题。在对/oauth/token的请求中,我在
redirect_uri
参数中打错了字。我修正了这个问题,它工作了。这是我的愚蠢错误!