您如何在Spring Security Oauth2中使用非密码授予类型?

时间:2018-07-30 17:44:29

标签: spring spring-security oauth-2.0 spring-security-oauth2 spring-oauth2

我看到Spring Security Oauth2具有不同的授予类型:

https://projects.spring.io/spring-security-oauth/docs/oauth2.html#grant-types

您如何使用非password的授权类型?

我目前可以使用基于密码的身份验证。

$ curl -u client:123456 http://localhost:8080/oauth/token -d grant_type=password -d username=admin -d password=admin -d client_id=client -d client_secret=123456 -d scope=write
{"access_token":"40add879-3be3-4d94-b969-4dc17975c659","token_type":"bearer","refresh_token":"583eb284-3318-432b-a8a3-b3eee744c9b7","expires_in":40688,"scope":"write"}

我已注释掉

@EnableAuthorizationServer
public class OAuth2Configuration extends AuthorizationServerConfigurerAdapter {
    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints
            .tokenStore(this.tokenStore).userDetailsService(userDetailsService);
//          .authenticationManager(new AuthenticationManager() {
//          @Override
//          public Authentication authenticate(Authentication authentication)
//                  throws AuthenticationException {
//              return authenticationManagerBuilder.getOrBuild().authenticate(authentication);
//          }
//      });

因此它将不再使用密码授予类型。 (“通过注入AuthenticationManager来打开密码授予”)。

然后我在API中搜索“ grant”

https://docs.spring.io/spring-security/oauth/apidocs/index.html

然后我尝试了

$ curl -u client:123456 http://localhost:8080/oauth/token -d grant_type=token -d client_id=client -d client_secret=123456 -d scope=write
{"error":"unsupported_grant_type","error_description":"Unsupported grant type: token"}
$ curl -u client:123456 http://localhost:8080/oauth/token -d grant_type=client -d client_id=client -d client_secret=123456 -d scope=write
{"error":"unsupported_grant_type","error_description":"Unsupported grant type: client"}
$ curl -u client:123456 http://localhost:8080/oauth/token -d grant_type=code -d client_id=client -d client_secret=123456 -d scope=write
{"error":"unsupported_grant_type","error_description":"Unsupported grant type: code"}

那么,如何在不使用数据库中的用户名和密码的情况下,创建仅客户端/秘密的授予类型来获取访问令牌?我无处找不到有效的grant_type列表!

这似乎是定义允许的授予类型的方法,但未指定有效值。

https://docs.spring.io/spring-security/oauth/apidocs/org/springframework/security/oauth2/config/annotation/builders/ClientDetailsServiceBuilder.ClientBuilder.html#authorizedGrantTypes(java.lang.String...)

1 个答案:

答案 0 :(得分:1)

对于基于客户凭证的令牌,请使用client_crendentials作为grant_type

$ curl -u client:123456 http://localhost:8080/oauth/token -d grant_type=client_crendentials -d client_id=client -d client_secret=123456 -d scope=write

没有这样的grant_type列表,因为授予类型是使用TokenGranter接口定义的,任何人都可以实现。但是,目前在Spring Security OAuth2框架中现成的四个主要grant_type实现如下:

  1. implicit
  2. client_credentials
  3. password
  4. refresh_token

您可以将以上任何一项用作grant_type