我目前正在爲一個OAuth2驗證程序的彈簧應用程序,但我得到了一些問題,實現自定義ClientDetailsService。春季安全的OAuth2 - 定製ClientDetailsService
我不能使用普通的inMemory甌JDBC clientDetailsService因爲客戶端的信息arn't存儲在我的應用程序,我讓他們從外部Web服務。但是當我設置一個自定義的ClientDetailService時,我不再獲得access_confirmation頁面(我得到一個空白頁面)。
要告訴你我的問題,我不使用我的應用程序,但是從官方春季香草測試 - 安全的OAuth項目spring-security-oauth
這裏的應用程序代碼:
@SpringBootApplication
@EnableResourceServer
@RestController
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@RequestMapping("/")
public String home() {
return "Hello World";
}
@RequestMapping(value = "/", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public String create(@RequestBody MultiValueMap<String, String> map) {
return "OK";
}
@Configuration
@EnableAuthorizationServer
protected static class OAuth2Config extends AuthorizationServerConfigurerAdapter {
@Autowired
private AuthenticationManager authenticationManager;
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.authenticationManager(authenticationManager);
}
@Override
public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
security.checkTokenAccess("isAuthenticated()");
}
public ClientDetailsService clientDetailsService() {
return new ClientDetailsService() {
@Override
public ClientDetails loadClientByClientId(String clientId) throws ClientRegistrationException {
BaseClientDetails details = new BaseClientDetails();
details.setClientId(clientId);
details.setAuthorizedGrantTypes(Arrays.asList("authorization_code"));
details.setScope(Arrays.asList("read, trust"));
details.setResourceIds(Arrays.asList("oauth2-resource"));
Set<GrantedAuthority> authorities = new HashSet<GrantedAuthority>();
authorities.add(new SimpleGrantedAuthority("ROLE_CLIENT"));
details.setAuthorities(authorities);
return details;
}
};
} //*/
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
// @formatter:off
clients.withClientDetails(clientDetailsService());
/*clients.inMemory()
.withClient("test")
.authorizedGrantTypes("authorization_code")
.authorities("ROLE_CLIENT")
.scopes("read", "trust")
.resourceIds("oauth2-resource");
//*/
// @formatter:on
}
}
}
正如你可以看到我添加了我的自定義clientDetailsService並更改了ClientDetailsServiceconfigurer配置,以設置它而不是內存clientDetailsService。
我的問題是,當試圖讓我的令牌我沒有得到我的access_confirmation頁面了我登錄的用戶之後。
,我發現我的問題,我在我的clientDetails的範圍的定義是假的。我有Arrays.asList( 「讀信」),而不是Arrays.asList( 「讀取」, 「信任」)
難道我錯過了什麼?我是否必須在其他地方設置自定義的clientDetailsService?
你有額外的信息像堆棧跟蹤或日誌都出現更多問題了嗎? –
我的測試沒有發現任何錯誤。 如果我試圖讓與郵差設置 令牌 - 本地主機:8080 /的OAuth /授權的授權網址 - 本地主機:8080 /的OAuth /令牌作爲憑證網址 - 測試的客戶端ID - authorization_code作爲交付式 我在用戶認證之後得到一個空屏幕(他沒有進入confirm_access頁面) –
如果我在瀏覽器中用這個URL測試它:http:// localhost:8080/oauth/authorize?client_id = test&redirect_uri = http://本地主機:8080 /&RESPONSE_TYPE =代碼我重定向到重定向-URI沒有得到confirm_access頁面 (用於瀏覽器的URL我知道網址也不行,讓我的標誌,但它應該是enuogh測試認證) –