我在春天配置了
的auth-serverclients
.inMemory()
.withClient("my-web-app")
.secret("my-web-app-secret")
.authorizedGrantTypes(//
"authorization_code",//
"refresh_token",//
"password"//
).scopes("openid")
现在我想为webapp开发一个命令行应用程序。因此,我需要使用单独的客户端ID和密码注册另一个客户端。 我做过类似的事情
.and()
.inMemory()
.withClient("my-cli")
.secret("my-cli-secret")
.authorizedGrantTypes("authorization_code","client_credentials")
.scopes("read","write","trust").authorities("ROLE_USER");
我想要实现的只是提供用户名/密码,客户端应用程序应该能够从auth服务器获取身份验证令牌。
我尝试和理解的是我应该使用资源所有者密码授予。在此之后我必须使用spring Oauth2restTemplate。 这种配置的问题是当我点击令牌时我正在
{
error: "unauthorized"
error_description: "Full authentication is required to access this resource"
}
并且每次与匿名用户打。
答案 0 :(得分:1)
如果您想使用用户名/密码来获取访问令牌,您肯定需要使用grant_type=password
。
您也不需要指定.inMemory()
两次 - 只有两个客户端.and()
。
所以配置必须像
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients
.inMemory()
// First client
.withClient("my-web-app")
.secret("my-web-app-secret")
.authorizedGrantTypes(//
"authorization_code",//
"refresh_token",//
"password"//
).scopes("openid")
// Second Client(CLI)
.and()
.withClient("my-cli")
.secret("my-cli-secret")
.authorizedGrantTypes("password")
.scopes("read", "write", "trust")
.authorities("ROLE_USER");
}
以及其他非常重要的事情 - 您需要在令牌的http请求中设置Authorization:
标头。所以标题应该是
"Authorization: Basic " + Base64.encodeBase64String((clientId + ":" + clientSecret).getBytes())
在用户名\密码之前检查此标头,并定义客户端(在您的情况下为CLI)是授权客户端(这可能会导致您的问题出错)。
如果您可以添加代码,请确切使用Oauth2RestTemplate