2017-07-07 157 views
2

我只是想學習OAuth。我寫了一些代碼來測試它。當我提出我得到 請求{ 「錯誤」:「INVALID_REQUEST」, 「ERROR_DESCRIPTION」:「缺少交付式」 }在郵遞員缺少授權類型錯誤

錯誤。

import java.util.Optional; 

//import static org.assertj.core.api.Assertions.tuple; 

import java.util.stream.Stream; 

import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
import org.springframework.security.core.userdetails.User; 

//import org.omg.PortableInterceptor.ACTIVE; 
import org.springframework.boot.CommandLineRunner; 
import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.data.jpa.repository.JpaRepository; 
import org.springframework.security.authentication.AuthenticationManager; 
import org.springframework.security.core.authority.AuthorityUtils; 
import org.springframework.security.core.userdetails.UserDetails; 
import org.springframework.security.core.userdetails.UserDetailsService; 
import org.springframework.security.core.userdetails.UsernameNotFoundException; 
import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer; 
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter; 
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer; 
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer; 
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer; 
import org.springframework.stereotype.Service; 

import lombok.AllArgsConstructor; 
import lombok.Data; 
import lombok.NoArgsConstructor; 

@SpringBootApplication 
public class SpringAuthServiceApplication { 

    @Bean 
    CommandLineRunner clr(AccountRepository accountRepository){ 
     return args -> { 
      Stream.of("name1, password1", "name2, password2", "name3, password3", "name4, password4") 
      .map(tpl -> tpl.split(",")) 
      .forEach(tpl -> accountRepository.save(new Account(tpl[0], tpl[1], true))); 
     }; 


    } 

    public static void main(String[] args) { 
     SpringApplication.run(SpringAuthServiceApplication.class, args); 
    } 
} 


@Configuration 
@EnableAuthorizationServer 
class AuthServiceConfiguration extends AuthorizationServerConfigurerAdapter{ 
    private final AuthenticationManager authenticationManager; 

    public AuthServiceConfiguration(AuthenticationManager authenticationManager) { 
     this.authenticationManager = authenticationManager; 
    } 

    @Override 
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception { 
     clients 
     .inMemory() 
     .withClient("html5") 
     .secret("password") 
     .authorizedGrantTypes("password") 
     .scopes("openid"); 

    } 

    @Override 
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { 
     endpoints.authenticationManager(this.authenticationManager); 
    } 



} 


@Service 
class AccountUserDetailService implements UserDetailsService{ 

    private final AccountRepository accountRepository; 

    public AccountUserDetailService(AccountRepository accountRepository) { 
//  super(); 
     this.accountRepository = accountRepository; 
    } 


    @Override 
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 
     // TODO Auto-generated method stub 
     return accountRepository.findByUsername (username) 
       .map(account -> new User(account.getUsername(), 
         account.getPassword(), account.isActive(), account.isActive(), account.isActive(), account.isActive(), 
         AuthorityUtils.createAuthorityList("ROLE_ADMIN", "ROLE_USER")) 
         ) 
       .orElseThrow(() -> new UsernameNotFoundException("Couldn't fine user name " + username + "!")) ; 
    } 

    /*@Override 
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 
     return accountRepository.findByUsername(username) 
       .map(account -> { 
        boolean active = account.isActive(); 
        return new User(
          account.getUsername(), 
          account.getPassword(), 
          active, active, active, active, 
          AuthorityUtils.createAuthorityList("ROLE_ADMIN", "ROLE_USER")); 
       }) 
       .orElseThrow(() -> new UsernameNotFoundException(String.format("username %s not found!", username))); 
    }*/ 

} 



interface AccountRepository extends JpaRepository<Account, Long>{ 
    Optional<Account> findByUsername(String username); 
} 



@Data 
@NoArgsConstructor 
@AllArgsConstructor 
@Entity 
class Account{ 

    public Account(String username, String password, boolean active) { 
     //super(); 
     this.username = username; 
     this.password = password; 
     this.active = active; 
    } 

    @GeneratedValue @Id 
    private long id; 
    private String username, password; 
    private boolean active; 


} 

這裏是我送的郵遞員:

在標題標籤: 內容類型:應用程序/ JSON 授權:基本aHRtbDU6cGFzc3dvcmQ =

在授權選項卡: 類型爲Basic驗證字段: Body選項卡,選擇表格數據和發送以下內容:

用戶名:用戶名 密碼:密碼1 grant_type:密碼 範圍:的OpenID CLIENT_ID:HTML5 client_secret:密碼

enter image description here

enter image description here

enter image description here

回答

2

OAuth2以查詢字符串的形式查找請求體內的參數,即application/x-www-form-urlencoded

將您的Content-Type更改爲application/x-www-form-urlencoded並檢查x-www-form-urlencoded而不是form-data

+0

解決了這個問題。非常感謝! – ThomasKA