3

Yaylı bağlantı hizmeti oluşturmayı deniyorum, kendi oauth2 kaynak sunucum tarafından izin verilir. Ben kaynak sunucu oluşturuldu:oauth2 ile dinlenme hizmeti: Belirteç için erişim belirteci bulunamadı

@Configuration 
@EnableResourceServer 
protected static class ResourceServer extends ResourceServerConfigurerAdapter { 

    @Autowired 
    private TokenStore tokenStore; 

    @Override 
    public void configure(ResourceServerSecurityConfigurer resources) throws Exception { 
     resources.tokenStore(tokenStore).resourceId("mobileapp"); 
    } 

    @Override 
    public void configure(HttpSecurity http) throws Exception { 
     http.authorizeRequests().antMatchers("/api/shop /**").authenticated().and() 
       .authorizeRequests().antMatchers("/auth/**").anonymous(); 
    } 

} 

ve yetkilendirme sunucusu:

@Configuration 
@EnableAuthorizationServer 
protected static class OAuth2Config extends AuthorizationServerConfigurerAdapter { 

    @Autowired 
    private AuthenticationManager auth; 

    @Autowired 
    private DataSource dataSource; 

    @Autowired 
    private BCryptPasswordEncoder passwordEncoder; 

    @Bean 
    public JdbcTokenStore tokenStore() { 
     return new JdbcTokenStore(dataSource); 
    } 

    @Bean 
    protected AuthorizationCodeServices authorizationCodeServices() { 
     return new JdbcAuthorizationCodeServices(dataSource); 
    } 

    @Override 
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception { 
     security.passwordEncoder(passwordEncoder); 
    } 

    @Override 
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { 
     endpoints 
       .authorizationCodeServices(authorizationCodeServices()) 
       .authenticationManager(auth) 
       .tokenStore(tokenStore()) 
       .approvalStoreDisabled(); 
    } 

    @Override 
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception { 
     clients.jdbc(dataSource) 
       .passwordEncoder(passwordEncoder); 
       .withClient("mobile") 
       .authorizedGrantTypes("password", "refresh_token") 
       .authorities("ROLE_CLIENT") 
       .scopes("read", "write", "trust") 
       .autoApprove(true) 
       .resourceIds("mobileapp") 
       .secret("123456"); 
    } 

ben bukle kullanarak, sunucusundan bir erişim simgesi almayı deneyin:

bukle -X POST'un -Vu mobil : 123456 http://localhost:8080/oauth/token -H "Accept: application/json" -d "password = test123 & [email protected] & grant_type = şifre & kapsamı = & client_secret okumak = "

Ben bir yanıt mesajı olarak bu hatayı alıyorum:

{ "123456 & client_id = mobil hata": "server_error", "ERROR_DESCRIPTION":" java .io.NotSerializableException: org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder "} tomcat günlükleri olarak

da

var

ossoptoken.store.JdbcTokenStore - için erişim simgesi bulma başarısız oldu belirteç

DÜZENLEME: şifre encoder Bean tanımı:

@Bean 
public BCryptPasswordEncoder passwordEncoder() { 
    BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder(); 
    return bCryptPasswordEncoder; 
} 

Bu fasulye içinde, sınıfta oluşturulan Hangi OAuth2Config ve ResourceServer bildirildi.

Kodu kontrol ettim ve hangi tablo yayının kullanıldığını ve tablonun boş olduğunu öğrendim. Sorum şu: otomatik olarak oluşturulmalı mı yoksa kodumla ilgili bir sorun mu var?

Yardım için şimdiden teşekkür ederiz.

+0

Eğer 'BCryptPasswordEncoder' fasulye sizin' Bean' @ tanımıyla soru güncellemek olabilir mi? – sthzg

+0

BCryptPasswordEncoder Bean tanımını ekledim. – Marcin

+0

Teşekkürler, '@ Bean' bence (benim için PasswordEncoder 'arabirimini kullanabilirsiniz rağmen), iyi görünüyor. Yerel olarak test ettiğimde, şifreli PW gibi "withClient (...). Secret (passwordEncoder.encode (" 123456 "))' ile "withClient (..). Secret (...)" 'ı ayarlamak zorundayım ama Bu, serileştirme hatasını açıklamıyor (kodlamadığımda aldığım bir "BadCredentials" yanıtını açıklamak ister.'Security.passwordEncoder (...) 'ayarlanmadığında her şeyin işe yarayıp yaramadığını kontrol ettiniz mi? – sthzg

cevap

4

JdbcTokenStore sınıfını geçersiz kılın ve bu işlevi ile değiştirin.

Erişim belirtecini bulamadığınız için sorununuzu çözdünüz. Bu sınıfı OAuth2Config dosyasında kullanın.

0

Modelinizde, serileştirilmemiş BCryptPasswordEncoder olmalıdır. Kullanıcı bmodelinizde geçici yapın.

private transient BCryptPasswordEncoder passwordEncoder;