【问题标题】:Spring-Security-OAuth2 - how to add fields to access token request?Spring-Security-OAuth2 - 如何添加字段以访问令牌请求?
【发布时间】:2017-04-06 18:57:35
【问题描述】:

我有一个 Spring Boot 应用程序,它使用带有 OAuth 2.0 的 Spring Security。目前,它针对基于 Spring 示例代码的身份验证服务器进行操作。但是,运行我们自己的 Auth Server 一直是促进开发的短期目标,而不是长期目标。我们一直在使用 authentication_code 授权类型,并希望继续使用它,而不管 Auth Server 实现如何。

我正在尝试更改以在 Azure Active Directory 中使用 OAuth 2.0 端点,以充当我们的身份验证服务器。到目前为止,我已经成功调用了 /authorize 端点。但是获取 /token 的调用失败并出现无效请求错误。我可以看到请求发出。

似乎 Azure 声明为强制的参数未填充到 POST 请求中。查看Azure doco,它希望client_id 定义在发布到端点的消息正文中,默认情况下,Spring 不会添加它。

谁能指出我如何将字段添加到构造访问令牌请求时使用的表单映射的正确方向?我可以看到在 OAuth2ClientConfiguration 中设置 AccessTokenRequest 对象的位置......

@Bean
@Scope(value = "request", proxyMode = ScopedProxyMode.INTERFACES)
protected AccessTokenRequest accessTokenRequest(@Value("#{request.parameterMap}")
Map<String, String[]> parameters, @Value("#{request.getAttribute('currentUri')}")
String currentUri) {
    DefaultAccessTokenRequest request = new DefaultAccessTokenRequest(parameters);
    request.setCurrentUri(currentUri);
    return request;
}

我应该尝试在 request.parameterMap 弹簧属性中定义地图吗?如果是这样,我不太确定它是如何工作的。

或者我应该使用 AuthorizationServerConfigurerAdapter 类中定义的接口之一?

我有发送 AccessTokenRequest 时要包含的信息,但我只是不知道配置 Spring 以包含它的最佳方法?感谢您的帮助。

【问题讨论】:

标签: spring-security-oauth2


【解决方案1】:

实际上,我发现了这一点。我需要更改客户端身份验证方案。只需将以下内容添加到我的应用程序属性中即可将 client_id 添加到表单中......

security.oauth2.client.clientAuthenticationScheme=form

如果您使用的是 yaml,则对其进行 yaml 化。谢谢春天!

【讨论】: