我正在尝试使用Spring Boot和Spring Security的OAuth2集成设置OAuth2授权服务器。
当我尝试进行身份验证时,我收到一条HTTP状态代码400
响应,说:“Bad Credentials”。
您可以在此处找到我的授权服务器和网络安全配置:https://gist.github.com/codecitizen/8d130469d83439f5fca86b1a84733aab
我有UserDetailsService
和ClientDetailsService
的自定义实现。但它们似乎已正确配置。当我运行以下测试用例时:
given().
formParam("grant_type", "password").
formParam("username", user.getUsername()).
formParam("password", password).
auth().basic(client.getClientId(), client.getClientSecret()).
when().
post("/oauth/token").
then().extract().asString();
使用RestAssurred,两个服务都被调用。
事件陌生人:当我在IntelliJ上为此表达式设置一个断点并对其进行评估时,它会返回一个正确的JWT令牌,并且身份验证似乎有效。当我再次执行测试方法并完全相同的事情时:{"error":"invalid_grant","error_description":"Bad credentials"}
这个响应!不改变代码中的任何内容!
我真的无法弄清问题是什么。任何有Spring Security + OAuth2经验的人都可以提供帮助吗?
答案 0 :(得分:0)
您确定使用正确的Oauth2授权类型设置了自定义ClientDetails。
如果您手工制作UserDetailsService,可能会使用默认授权类型(而不是您所需的password
授权类型)配置
要添加password
授权类型,您需要执行以下操作:
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
InMemoryClientDetailsServiceBuilder clientsBuilder = clients
.inMemory()
.withClient("clientid")
.scopes("openid","read", "write")
.authorizedGrantTypes("password", "refresh_token", "authorization_code")
.secret("clientSecret"));
}